5

私は、rabbitmq を使用して通信するプロジェクトに取り組んできました。最近、ラビット ルーティング機能を使用すると、スケーラビリティが大幅に向上することがわかりました。したがって、基本的には、キューを複数のルーティング キーにバインドし、 type の exchange を使用しますdirect

パブリッシュ/サブスクライブのように機能します。そのため、キューをさまざまなイベントにバインドおよびバインド解除して、コンシューマー/サブスクライバーが関心のあるメッセージのみを受信できるようにすることができます。

もちろん、プロデューサー/パブリッシャーはバインディング キー (イベント名) を使用しrouting_keyて pika 実装に渡します。ただし、存在しないバインディングに対して何かを発行すると、メッセージは失わfooれますpika.basic_publish(..., routing_key='foo')

だから私の質問は:

メッセージが実際にキューに発行されたかどうかを知ることは可能ですか?

私が試したこと:

  • pika.basic_publish の戻り値を確認しています。常に を返しますNone

  • 存在しないバインディングを発行しようとしたときに例外があるかどうかを確認します。なにもない。

  • 帯域外制御を行うための追加のキューを持つ (すべてのサブスクライバーが同じプロセスによって実行されるため)。このアプローチは私にとって理想的ではありません。

追加情報

  • このルーティング機能を使用しているため、キュー名は rabbit によって生成されます。新しいアプローチでキュー自体に名前を付けなければならない場合でも、問題はありません。

  • キューの代わりにエクスチェンジへのバインドを必要とする新しいアプローチが提案された場合は、それを聞きたいと思いますが、実際には AMQP ではなく、rabbitmq によって実装された拡張であるため、避けたいと思います。

  • ピカバージョンは0.9.5です

  • rabbitmq のバージョンは 2.8 です

どうもありがとう

4

2 に答える 2

8

あなたの問題に対する答えは、RabbitMQの必須フラグだと思います。

このフラグは、メッセージをキューにルーティングできない場合の対応方法をサーバーに指示します。具体的には、必須が設定されていて、バインディングを実行した後、メッセージがゼロキューに配置された場合、メッセージは送信者に返されます(basic.returnを使用)。同じ状況で必須が設定されていない場合、サーバーはメッセージをサイレントにドロップします。

これは基本的に、メッセージをキューに入れ、ルーティングできない場合はメッセージを私に返すことを意味します。仕様のbasic_publishを見て、オンにします。

于 2012-09-10T13:22:23.813 に答える
0

デッドレター交換を使用して、消費されていないメッセージを保存できる場合がありますhttp://www.rabbitmq.com/dlx.html

これがまさにあなたが探しているものかどうかはわかりませんが、解決策として使用できます。

于 2012-09-10T11:03:47.670 に答える