私たちの環境では、AWSでRabbitMQとCeleryを使用して、多くのノードで並列にタスクを実行しています。AWS ELBとRabbitMQを使用したセロリー接続の削除
最近、私たちはRabbitMQを3ノードのクラスタにし、HAポリシーを設定し、ポート5672のAWS弾性ロードバランサ(ELB)をすべての3ノードに追加しました。私たちのセロリの労働者とクライアントコードはすべて、ブローカーURLとしてELB DNSを使用します。
この変更以来、非同期タスクが完了するのを待つと、例外IOError: Socket closed
がスローされます。
ELBは、60秒後にすべてのアイドル接続をシャットダウンします。私たちは完了するのに数時間かかる作業があります。
BROKER_HEARTBEATを、ワーカー側の接続切断数が60未満の値に設定します。しかし、クライアントの接続を維持するための設定を見つけることはできません。
セロリで長時間実行されるタスクを待つ正しい方法ですか?
まだテストしていない1つの回避策は、正常に終了するまでAsyncResult.wait()
メソッドを呼び出すことです。だから、例えば:
async_result = task.delay(params)
while True:
try:
async_result.wait()
break
except IOError:
pass
:
- RabbitMQの3.6.5
- セロリ3.1.20
- セロリバックエンドpyamqp
- セロリ結果バックエンドは、RPC
ここで私は外に出かけるつもりですが、あなたは自分自身に古典的なXY問題があると言います。バットからすぐに、非同期作業を待っている間、スレッドを一時停止することに伴うかなりの臭いがあります。第2に、一般的なケースでは、ELB/Route 53は何百万と何百万という要求に対応するように設計されています。この考え方を念頭において、彼らがあなたのソケットを何時間も開いたままにしておくと、かなり早く圧倒されるでしょう。私はあなたがタコで床を畳んでいるのを見いだすだろうと思っています。あなたはあきらめて、モップを買ってください。 – nsfyn55