2017-07-11 7 views
2

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) 
); 

答えて

3

はい、パブリッシャーのキューと交換を宣言できます。ユーザーがRabbitMQを仕事の仕事のキューとして使用するRabbitMQユースケースが数多くあります。キューと交換は、まだ存在しない場合には宣言され、作成されます。 (RabbitMQでは、異なるパラメータを使用して既存のキューを再定義することはできず、実行しようとするプログラムにエラーが返されます)。

実行時に定義することをお勧めします。基本交換/キュー/アプリケーション設定が起動したとき(またはキュー/交換が必要なとき)のルーティング設定。 RabbitMQがあなたのキューを失うことがないようにするには、それを耐久性のあるものとして宣言する必要があります。メッセージが失われないようにするには、キューとメッセージの両方を耐久性のあるものとしてマークする必要があります。 (https://www.cloudamqp.com/blog/2017-03-14-how-to-persist-messages-during-RabbitMQ-broker-restart.html

+1

ありがとう!私は現在、1つの(ダイレクトルーティングされた)交換にリンクされ、専用のルーティングキーを介して2つのキューのいずれかにすべての可能なジョブタスクをバインドする、無関係なジョブ用に2つの異なるキューを設定しています( 'media'と' bookings')。それは理にかなっていますか?またはタスクを特定のキューにマッピングするためのよりよいアプローチがありますか(トピックを使用している可能性があります)? –

+1

はい、1つのキューにメッセージをルーティングする必要がある限り、意味があります。トピックの交換は、メッセージを1つのジョブに多数のサービスを登録できるさまざまなキューに送信する場合に便利です。たとえば、1つのメッセージで異なる行動を取る必要がある複数のサービス/ワーカーがいる場合 – Johansson

+0

クール、ありがとう! –

関連する問題