私はセロリとrabbitmqを使用して、次のようなチェーンを実行しています:
fetch -> parse -> write pages
このwrite pages
部分は、個々のページを並行して書き込む独自の非同期タスクのセットを発行します (この他の私の質問で説明されているように: In Celery Task Queue, is running tasks in a group any different from multiple asyncs in a loop? )
これを長時間実行すると、最終的には停止することがわかりました。セロリを再起動すると再び発生しますが、別の 60 ほどのタスクを実行した後にのみ、再び停止します。
これは、キューのサイズが 400k を少し超えると発生することに気付きました。
fast@build1 ~/dev/content-admin $ sudo rabbitmqctl list_queues
Listing queues ...
build1.prod2.ec2.cmg.net.celery.pidbox 0
celery 433410
...done.
キューにアイテムを追加するこれらの「ページの書き込み」タスクでキューがいっぱいになり、キューが「いっぱい」になると、それらの新しく追加されたタスクを実行する機会が得られないことが起こっていると思います。
「ページの書き込み」タスクを一時的に変更して、すぐに戻る (何もしない) ことを実験しました。これにより、輻輳が解消され、約 400,000 ページすべての出力が有効になったようです。ただし、それが機能した理由は 100% ではありません。
RabbitMQ または Celery によって課される上限はありますか? そして、それは利用可能なメモリに基づいていますか? それとも設定可能ですか?そして最後に:これが起こらないように、どうすればタスクをより適切に管理できますか?
redis は私がやっていることにより適していますか?
「ページの書き込み」ワーカーがもっとあれば役立つと思いますが、「ページの書き込み」タスクが優先されるように何らかの方法で強制したいと考えています。
これについて何か助けていただければ幸いです。ありがとうございました!