2

3 つ目の RabbitMQ チュートリアルについて質問があります。プロデューサーが交換にメッセージを送信するときにコンシューマーが実行されているという保証がないことを除いて、私は似たようなものを実装しようとしています。

したがって、メッセージをファンアウト交換に発行するプロデューサーがあります。

$channel->exchange_declare('my_exchange', 'fanout', false, false, false);
$channel->basic_publish('my_message', 'my_exchange');

パブリッシャーでキューを宣言し、それをエクスチェンジにバインドします。

list($queueName,, ) = $channel->queue_declare("", false, false, true, false);
$channel->queue_bind($queueName, 'my_exchange');

そして、これが私の問題の根源です。チュートリアルには次のように書かれています。

キューがまだエクスチェンジにバインドされていない場合、メッセージは失われますが、それは問題ありません。コンシューマーがまだリッスンしていない場合は、メッセージを安全に破棄できます。

これらのメッセージをどうにかして保存する方法はありますか? コンシューマーが起動すると、以前に送信されたメッセージにアクセスしますか? その方法を見つけた唯一の方法は、プロデューサーとパブリッシャーで同じキューを宣言することですが、交換と異なるコンシューマー用の個別のキューを持つという目的を無効にします。

4

2 に答える 2

1

コンシューマーは自分自身をキューにアタッチする必要があり、独自のキューを宣言するべきではありません。キューは、実行する作業のバケットと考えてください。ワークロードに応じて、これらのキューに N 個のコンシューマーを追加して作業を行うことができます。

エクスチェンジを作成するときは、そのエクスチェンジにアタッチされた 1 つ以上のキュー (作業のバケット) が必要です。これを行うと、メッセージがキューに流れ込み、キューアップを開始します (しゃれを許してください)。コンシューマーは、準備ができたらいつでもアタッチして作業を開始できます。

于 2016-10-25T18:01:41.637 に答える