2011-08-22 7 views
20

私はRabbitMQでCeleryを使用しています。最近、多数の一時的なキューが作成されていることがわかりました。Celeryで作成された一時キュー

タスクが失敗したとき(つまりタスクが例外を発生させるとき)、ランダムな名前の一時的なキュー(c76861943b0a4f3aaa6a99a6db06952cなど)が形成され、キューが残っていることを実験したところ、

次のようにrabbitmqadminに見られるような一時的なキューのいくつかのプロパティがある -

auto_delete:真 消費者:0 耐久性:偽 メッセージ:1 messages_ready:1

そして、もう一つ、このような一時的なキューをタスクが失敗するたびに(すなわち、例外を発生させて)作成されます。このような状況を避けるには?私の生産環境では、このようなキューが多数形成されるためです。

+0

これは興味深い観察です!私も知りたいです。 –

+1

こんにちは。私はこの問題を解決することができました。答えを見てください(私も同様です)。それが役に立てば幸い。 – Siddharth

答えて

11

まあ、フィリップがそうです。以下は私がそれをどのように解決したかの説明です。これはceleryconfig.pyの設定です。

フィリップ氏によると、私はまだCELERY_BACKEND = "amqp"を使用しています。しかしそれに加えて、私は現在CELERY_IGNORE_RESULT = Trueを使用しています。この構成では、すべてのタスクで余分なキューが形成されないようにします。

私はすでにこの構成を使用していましたが、タスクが失敗しても余分なキューが形成されました。それから私はCELERY_STORE_ERRORS_EVEN_IF_IGNORED = Trueだった別の構成を使用して削除する必要があることに気付きました。これにより、すべてのタスクの結果が格納されず、エラー(失敗したタスク)のみが処理され、失敗したタスクのキューが1つ追加されました。

+0

うわー!これは私のためにそれを解決しました。私は、各タスク記述子でignore_result = Trueを設定していたので、これが問題だったことさえ気づかなかった。しかし、私はCELERY_IGNORE_RESULT = TrueとCELERY_STORE_ERRORS_EVEN_IF_IGNORED = FalseとViolaを追加しました。処理後に余分なキューがなくなりました!私はまだ代替のバックエンドとしてredisを検討するかもしれませんが、この解決策を見つけたのは本当にいいことです。ありがとうございました! – chaimp

+0

@jeffp - それを聞いてうれしい。私は最近レデリスをセロリと共に使っています - それはそれが問題ではないと私は思います。 Celery自体がキューを形成し、維持します。したがって、この構成は重要です。 – Siddharth

+1

私は実際に、これを読んだ人にとって非常に役立つだろうと思った過去の日に別のものを発見しました。複数の作業者がいて、各作業者に異なる作業を任せる必要があります。 celeryd-multiについて学び、それを使用することをお勧めします。ドキュメントではこのことは明白ではありませんが、使用可能なシステムリソースを効果的に使用し、キューをバックアップしないことが重要です。 – chaimp

16

結果バックエンドとしてamqpを使用しているようです。ここdocsから、その特定の設定を使用しての落とし穴は、次のとおりです。

  • すべての新しいタスクはブローカーがキューで過負荷にすることができる、これは
    に影響を与えます タスクの数千人で、サーバー上に新しいキューを作成しますパフォーマンスに悪影響を与えます。あなたがRabbitMQのを使用している場合は、各
    キューは別のErlangのプロセスになりますので、あなたが
    に計画している場合は、同時にあなたはアーラン
    プロセスの上限を増やす必要がある、とファイル記述子の最大数も多くの結果を保ちますお使いのOS
  • 古い結果が自動的にクリーニングされることはありませんことができますので、あなたは は、最終的に制御不能になります結果や他のキューの数を消費する を確認する必要があります。 RabbitMQ 2.1.1または を実行している場合は、x-expires引数を利用して 未使用のキューを期限切れにした のキューを有効にできます。キューの有効期限は、 CELERY_AMQP_TASK_RESULT_EXPIRESの設定で秒単位で設定できます(デフォルトでは有効になっていません)。私はchangelogに何を読んでから、

ユーザーがこの動作により、後端部にビットを取得していたので、これはもはやバージョン> = 2.3.0のデフォルトのバックエンドではありません。あなたが必要とする機能ではない場合、結果のバックエンドを変更することをお勧めします。

+0

CELERY_AMQP_TASK_RESULT_EXPIRESは廃止されました.CELERY_TASK_RESULT_EXPIRESは新しい設定の設定名です。デフォルトは1日分保存し、0に設定すると永遠に保存されます。 – cbron

3

CELERY_TASK_RESULT_EXPIRESは、一時キューの存続時間を決定します。デフォルトは1日です。この値は変更できます。

0

amqpバックエンドを使用してadd_consumer、cancel_consumerなどのようなものを行う能力を失うことに注意しては、各タスクのための新しいキューを作成します。それを避けたい場合は、rpcバックエンドを使用して、結果を単一のキューに保持することができます。お使いの設定で

は、あなたがthis on celery docsの詳細を読むことができ

CELERY_RESULT_BACKEND = 'rpc' 
CELERY_RESULT_PERSISTENT = True 

を設定します。

関連する問題