2017-10-10 15 views
-4

パブリッシャが既知のエクスチェンジにメッセージを送信する必要があるシナリオがあります(ダウンストリームキューを直接認識しません)。ほとんどのメッセージは、(ファンアウトのように)すべてのバインドされたキューに配信される必要がありますが、一部は特定のバインドされたキューにのみ配信する必要があります。私は複数の交換や複数の待ち行列のボンドを避けたいと思います。RabbitMQ/AMQP Exchangeルーティング戦略

現在のソリューションでは、ヘッダールーティングが使用されています。メッセージには2つのヘッダーのいずれかがあり、「グローバル」または「特定のサブに固有」と識別されます。この場合、ダウンストリームキューは、ヘッダー。私はこれがうまくいくと思いますが、もっと簡単な解決法があるはずです。

「特定のメッセージを除くすべてのメッセージをファンアウトする」Exchangeプラグインを見つけようとしましたが、そのようなプラグインは見つかりませんでした。それ以外に、そのようなルーティング戦略を実装する方法に関するアイデアはありますか?

+0

わからないあなたはdownvotedなっている理由が、私は、トピック交換のための最良の選択肢であると思うだろうこの。 – mshindal

+0

@mshindal - その理由もわからない。正当なユースケースのための合理的な質問のように思えます(そして私はたくさんの研究をしました)。あなたの提案に関しては、クライアントごとに2つのキュー(「すべてのメッセージ」と「特定のメッセージ」)をバインドしない限り、トピック交換でこの作業を行う方法がわかりません。あなたが気にしていた2つの列はありますか? – eric

答えて

0

私のオリジナルの解決策は、新しい交換プラグインを作成するのに手間がかかり、「マッチ」を使用してバインドされたキューと「ヘッダー」交換を使用する唯一の方法です。それはうまくいき、これまでのところ合理的に高速です(少なくともこのシナリオでは適用できない典型的な "トピック"交換よりも遅くはありません)。

このトピックに関する私の研究から、理想的な解決策は、RegExまたは少なくとも何らかの形の「論理」を使用する能力を持つ「トピック」交換です。私は、RegExを使うことを意味するいくつかの情報を見つけましたが、RegExを使用するとすべての新しいメッセージごとにすべてのバインディングを評価する必要があるため、後者がより高速だったために(ドット表記法のトピック形式に賛成して) (つまり、「検索のショートカット」を構築する方法はありませんでした)。

今のところ私の "match-any headers exchange"ソリューションは私の目的に役立ちますが、将来的には "or-logic"を可能にする "topic"交換が検討に値するかもしれません。 RegExのオーバーヘッドなしで、単一バインディングで複数のトピックパターンを実現できます。しかし、Erlangには経験がなく、必要なプラグインを書くのに十分な時間を覚えていません。もし誰かがこれに協力することに興味があるなら、私に連絡してください。

0

リッチルーティングは実際にはRMQの強みの1つなので、あなたが説明するものは交換交換と同様に聞こえます。

ファンアウト(一般的なケース)またはトピック/ダイレクトワン(特別なもの)のいずれかを指すエントリ交換を作成し、すべてのルーティングをRMQに任せることができます。 entry-exchangeあなたがヘッダに入れたいものに応じて、ヘッダ交換又は直接のいずれかになります。

entry-exchange -----> fanout-exchange ---*---> multiple-fanout queues 
       \ 
       \---> the special exchange --> queue-for-special-usecase 
+0

はい、私は束縛された交換を使用して見ていましたが、私が見つけたすべての解決策(私があなたが示唆していると考えているものを含む)は、クライアントが2つの異なるキュー(ファンアウト用とダイレクト用)にバインドされている必要があります。これは私が特に避けようとしていたものです。多数のクライアントが存在するため、私はそれを2倍に増やしたくありませんでした。 – eric