13

おそらく私はばかげた質問をしているのかもしれませんが、さらに作業を行う前に、基本的な概念に頭を悩ませる必要があります。

複数のCeleryワーカーノードとRabbitMQノードをブローカーとして使用して、数千のRSSフィードを処理しています。各フィードのURLは、キューにメッセージとして書き込まれています。ワーカーはキューからURLを読み取り、処理を開始するだけです。1つのRSSフィードが2人のワーカーによって同時に処理されないようにする必要があります。

タスクが一度に1つだけ実行されるようにするという記事は、フィードが処理されているときにフィードをロックするためのMemcahcedベースのソリューションを提案しています。

しかし、私が理解しようとしているのは、RabbitMQキュー上のメッセージが複数のワーカーによって同時に消費されないようにするために、なぜMemcached(または他の何か)を使用する必要があるのか​​ということです。この目標を達成するためにできるRabbitMQ(またはCelery)の構成変更はありますか?

4

3 に答える 3

5

通常の動作設定では、単一のMQメッセージが複数のコンシューマーに表示されることはありません。ワーカーの失敗/クラッシュ、自動確認、メッセージ拒否などのケースについては、いくつかの作業を行う必要がありますが、基本的なケースは健全です。

リンクした記事に同期キュー(読み取り:MQ)が表示されないため、(私が知る限り)代わりにロックメカニズム(読み取り:memcache)を使用して同期しています。そして、適切なMQセットアップでは発生しないいくつかの問題について考えることができます。

于 2012-08-28T09:29:30.063 に答える
4

他の人が指摘しているように、あなたはリンゴとオレンジを混ぜています。

セロリの仕事とMQメッセージであること。

メッセージが同時に1人のワーカーによってのみ処理されるようにすることができます。

例えば。

@task(...)
def my_task(

my_task.apply(1)

.applyは、使用しているメッセージブローカー(rabbit、redis ...)にメッセージを公開します。次に、メッセージはキューにルーティングされ、一度に1人のワーカーによって消費されます。あなたはこれのためにロックする必要はありません、あなたはそれを無料で持っています:)

セロリクックブックの例は、そのような2つのメッセージ(my_task.apply(1))が同時に実行されないようにする方法を示しています。これは、タスク自体の中で確認する必要があるものです。

もちろん、すべてのワーカー(memcached、redis ...)からアクセスできるものが必要です。これらは、異なるマシンで実行されている可能性があるためです。

于 2012-08-28T10:07:04.713 に答える
2

他の目的で通常使用される例として言及されています。これにより、同じ意味を持つ(同じメッセージではない)異なるメッセージを操作できなくなります。たとえば、2つのプロセスがあります。1つはいくつかのURLをキューに入れ、もう1つはキューからURLを取得してフェッチします。最初のプロセスが1つのURLを2回(またはそれ以上)キューに入れるとどうなりますか?

PS私はこの目的のためにRedis保管とsetnx操作に使用します(キーを設定できるのは1回だけです)。

于 2012-08-28T06:10:51.127 に答える