2016-05-30 1 views
3

私は1つの直接交換を持っています。この交換にバインドされたキューも1つあります。AMQP/RabbitMQの - プロセスメッセージが順次

私はそのキューに対して2つのコンシューマを持っています。消費者は、対応する処理を実行すると、手動でメッセージを確認します。

メッセージは論理的に順序付け/ソートされており、この順序で処理する必要があります。すべてのメッセージが消費者Aと消費者Bの間で順次受信され、処理されるように強制することは可能ですか?つまり、AとBが同時にメッセージを処理しないようにします。

注:消費者はで、同じ接続やチャンネルを共有していません。です。つまり、<channel>.basicQoS(1);は使用できません。

この質問の根拠:両方の消費者は同一です。一方がダウンすると、もう一方のキューはメッセージの処理を開始し、必要な介入なしにすべてが動作し続けます。

答えて

0

通常、MQシステムのポイントは作業負荷を分散することです。もちろん、メッセージNの処理が、メッセージN-1、またはN-1メッセージ自体を処理した結果に依存するいくつかの状況が存在する。

AとBが同時にメッセージを処理できない場合、その理由だけでAまたはBだけを持っていませんか?私はそれを見ると、あなたが他の1がない場合にのみ1が動作できるような方法で2人の消費者を有するものを保存していません...あなたの場合は

、それは1人の消費者を持っていることが最善だろうが、実際に処理部分で並列化を行います(実際には単語ではありません)。ただ、RMQは、任意の基準にかかわらず、(ラウンドロビン方式で)すべての消費者に均等にメッセージを配布していることを追加する

。もちろん、これはプリフェッチが1に設定されているときです。デフォルトでは1に設定されています。そのhereの詳細については、 "fair dispatch"をご覧ください。

+1

あなたの洞察をいただきありがとうございます。あなたの質問に戻ると、なぜAかBしかないのですか?AとBは同時にメッセージを処理すべきではないというあなたの理解に間違いありません。それは確かに 'AまたはB'です。しかし、私はAとBの両方を実行すると便利だと考えました。もしAかBがクラッシュした場合、システムは手動で介入せずに続行できます。私のアプローチは実際には不可能であることをあなたから理解しています。しかし、問題は次のとおりです。「A」(または「B」)から「B」(または「A」)への正しいフェイルオーバーをどのように容易にすることができますか? –

+0

ようこそ。それがクラッシュした場合に再起動する 'A'の監視エージェント(ウォッチドッグ)を持たせるのは簡単ですし、どんな方法でも' A'から 'B'へのフェールオーバーを行うのは簡単でしょう。メッセージは失われず、キューに入れられ、消費者が再び起きたときに配信されます。 – cantSleepNow

+0

OKです。 RabbitMQは高度なフェールオーバー機能を提供していますか?私は管理プラグインとREST APIがあることを知っていますが、それはちょうど監視(afaik)です。どのようなプラグイン/ライブラリ/ツール(RabbitMQまたはサードパーティ製)が、自動的にフェイルオーバーを開始することをお勧めしますか? –

1

冗長なコンシューマを必要とするが特定の順序でメッセージを処理する必要がある場合のフェールオーバーの処理方法の1つは、キューにバインドを設定するときに排他的なコンシューマオプションを使用し、排他ロックを取得できない場合でもバインドする

プロセスは、このようなものです:

  1. 消費者Aは、最初に起動し、排他的な消費者としてキューに結合します。コンシューマAはキューからのメッセージの処理を開始します。
  2. 次にコンシューマBが開始され、排他コンシューマとしてキューにバインドしようとしますが、キューにはすでに排他コンシューマがあるため、拒否されます。
  3. 定期的に、コンシューマBはキューで排他バインドを取得しようとしますが、拒否されます。
  4. コンシューマAをホストしているプロセスがクラッシュします。
  5. コンシューマBが排他的なコンシューマとしてキューにバインドしようとし、この時間が成功します。コンシューマBは、キューからのメッセージの処理を開始します。
  6. コンシューマAがオンラインに戻され、排他バインドが試行されますが、拒否されました。
  7. コンシューマBは、FIFO順にメッセージを処理し続けます。

このアプローチは負荷分散を提供しませんが、冗長性を提供します。