私はbeanstalkdのPerlクライアントを使用しています。同じ作業を2回エンキューしない簡単な方法が必要です。
基本的にK個の要素ができるまで待ってからグループ化する必要があるものが必要です。これを達成するために、私にはプロデューサーがいます:
insert item(s) into DB
insert a queue item into beanstalkd
そして消費者:
while ( 1 ) {
beanstalkd.retrieve
if ( DB items >= K )
func_to_process_all_items
kill job
}
これは、リクエスト/処理の数に比例しますが、次の場合です。
insert 1 item
... repeat many times ...
insert 1 item
これらすべての挿入がジョブが取得される前に発生したと仮定すると、これによりN個のキュー項目が追加され、次のようになります。
check DB, process N items
check DB, no items
... many times ...
check DB, no items
後のジョブリクエストを不必要に挿入/処理しないように、これを行うためのよりスマートな方法はありますか?