official RabbitMQ examplesのすべてが、のキューとバインディングを設定しています。 Publish/Subscribe tutorialにはキューがまだ交流にバインドされていない場合交換とキュー(プロデューサとコンシューマ)のバインドを設定する場所は?
メッセージが失われますが、それは私たちのために大丈夫 だと述べています。消費者がまだ聞いていない場合は、メッセージを安全に破棄することができます。
私はRabbitMQの上にジョブワーカーキューを実装しているので、これは絶対に大丈夫です。消費者がまだ実行されていないときにメッセージを失わないことが重要です。したがって、私はプロデューサに交換< - >キュールーティングを確立することを考えています。この例題が逆の理由はありますか?
RabbitMQサーバーに接続するたびに、または基本的にRabbitMQインスタンスを設定するために(一度だけ)基本交換/キュー/ルーティングの設定を行うことをお勧めしますか?現在、メッセージを公開する私のアプローチは、次のようになります。
const getChannel =() =>
ampq.connect() // The real implementation caches the connection
.then(conn => conn.createChannel())
.then(channel => channel.assertExchange(...)
.then(() => channel.assertQueue(...)) // Assert and bind for all queues
.then(() => channel.bindQueue(...)) // Assert and bind for all queues
);
const publish = (task, payload) =>
getChannel().then(channel =>
channel.publish(exchange, task, payload)
);
ありがとう!私は現在、1つの(ダイレクトルーティングされた)交換にリンクされ、専用のルーティングキーを介して2つのキューのいずれかにすべての可能なジョブタスクをバインドする、無関係なジョブ用に2つの異なるキューを設定しています( 'media'と' bookings')。それは理にかなっていますか?またはタスクを特定のキューにマッピングするためのよりよいアプローチがありますか(トピックを使用している可能性があります)? –
はい、1つのキューにメッセージをルーティングする必要がある限り、意味があります。トピックの交換は、メッセージを1つのジョブに多数のサービスを登録できるさまざまなキューに送信する場合に便利です。たとえば、1つのメッセージで異なる行動を取る必要がある複数のサービス/ワーカーがいる場合 – Johansson
クール、ありがとう! –