2011-10-26 30 views
4

Django、Celery、RabbitMQを使ってメーリングリストの管理者を書いています。メッセージが到着すると、受信者ごとにタスクが実行されます。すべてのタスクは単一のキューに行き、1人または複数のワーカーはキューからタスクを消費し、電子メールメッセージを作成して送信します。Celeryで動的にキューを作成する

単一のキューでは公平性の問題が発生します。メッセージが大規模なメーリングリストに送られると、多数のタスクがキューに追加され、他のメッセージはすべてのメッセージ大きなリストに送信されました。これを回避する方法は?

概念的には、各メーリングリストごとにキューを作成し、さまざまなキューラウンドロビンのタスクをワーカーに消費させることが考えられます。私は動的に新しいメーリングリストを作成できる必要があるので、これはセロリーで可能ですか?私は、キューを動的に作成する機能や、新しいキューから作業者を使用する機能を見ていません。

+1

タスクの優先順位は素晴らしい解決策です。恥知らずのウサギはそれらをまだ実装していません(http://docs.celeryproject.org/ja/master/faq.html#does-celery-support-task-priorities)。 – RickyA

+1

@Vebjorn Ljosa、こんにちは、どうやって解決しましたか? – securecurve

答えて

2

以下の図に示すように、直接交換の代わりにトピック交換を使用するシステムを検討してください。

直接交換とは異なり、トピック交換により、異なるメッセージを異なるキューにルーティングすることができます。これは、各メッセージに対してrouting_keyを設定し、特定のルーティングキーを持つメッセージのみを受け入れるように特定のキューをバインドすることによって行われます。

システムは、高い優先度を専用キューに設定し、消費者を同様に通常または低優先度メッセージを1つ以上のキューで処理するように設定できます。

セロリは複数のワーカー間で負荷分散をサポートします(ワーカーの数はハードウェアに依存します)。 BROKER_POOL_LIMIT、PREFETCH_LIMITなどセロリの設定を変更すると、ロードバランスが改善され、輻輳が減少します。

enter image description here

関連する問題