11

RabbitMQ と Python でコンテンツベースのルーティングを行うことは可能ですか?

AMQP 標準と RabbitMQ はコンテンツ ベースのルーティングをサポートすると主張していますが、コンテンツ ベースのバインディングなどの指定をサポートする Python 用のライブラリはありますか?

私が現在使用しているライブラリ (py-amqplib http://barryp.org/software/py-amqplib/ ) は、単純なパターン マッチング (#、*) によるトピックベースのルーティングのみをサポートしているようです。

4

2 に答える 2

20

答えは「はい」ですが、それだけではありません... :)

まず、コンテンツベースのルーティングが何を意味するかについて同意しましょう。2 つの意味が考えられます。メッセージのヘッダー部分に基づいていると言う人もいます。メッセージのデータ部分に基づいていると言う人もいます。

最初の定義を採用する場合、これらは多かれ少なかれ私たちが行う仮定です。データはどこかで存在し、何らかのソフトウェアによって AMQP ブローカーに送信されます。このソフトウェアは、コンテンツを説明するメッセージのヘッダーにキーと値 (KV) のペアを入れるのに十分なデータを知っていると想定しています。理想的には、送信者がデータのプロデューサーでもあるため、必要なだけ多くの情報が含まれています。データが画像だとしましょう。次に、送信者に次のようにメッセージ ヘッダーに KV ペアを挿入させることができます。

width=1024
height=768
mode=bw
photographer=John Doe

これで、適切なキューを作成して、コンテンツ ベースのルーティングを実装できます。白黒画像に対して実行する別の操作と、カラー画像に対して実行する別の操作があるとします。2 つのキューを作成できます。1 つは でメッセージを受信しmode=bw、もう 1 つは で受信しますmode=colour。次に、これらのキューをリッスンする個別のクライアントを用意します。ブローカーがルーティングを実行し、クライアントにはルーティングを認識する必要があるものは何もありません。

2 番目の定義を採用すると、さまざまな仮定から出発します。データがどこかに存在し、何らかのソフトウェアによって AMQP ブローカーに送信されると仮定します。しかし、そのソフトウェアがヘッダーに KV ペアを入力するように要求するのは賢明ではないと想定しています。代わりに、データ自体に基づいてルーティングを決定したいと考えています。

AMQP には、このための 2 つのオプションがあります。特定のデータ形式の新しい交換を実装することを決定するか、ルーティングをクライアントに委任することができます。

RabbitMQ には、直接 (1 対 1)、ファンアウト (1 対 N)、ヘッダー (ヘッダーでフィルター処理された 1 対 N)、およびトピック (トピックでフィルター処理された 1 対 N) 交換がありますが、 AMQP 標準に従って独自に実装できます。これには、多くの RabbitMQ ドキュメントを読み、Erlang で交換を実装する必要があります。

もう 1 つのオプションは、特別な「コンテンツ ルーティング キュー」をリッスンする AMQP クライアントを Python で作成することです。メッセージがキューに到着するたびに、ルータークライアントがそれを取得し、ルーティングの決定を行うために必要なすべてのことを行い、メッセージを適切なキューにブローカーに送り返します。したがって、上記のシナリオを実装するために、Python プログラムは画像が白黒かカラーかを検出し、それを「白黒」または「カラー」キューに (再) 送信します。適切なクライアントが引き継ぎます。

2 番目の質問ですが、コンテンツ ベースのバインディングを行うクライアントで行うことは実際には何もありません。クライアントが上記のように機能するか、RabbitMQ 自体で新しい交換タイプを作成します。次に、クライアント セットアップ コードで、交換タイプを新しいタイプに定義します。

これがあなたの質問に答えることを願っています!

于 2010-08-11T12:41:13.043 に答える
6

RabbitMQ では、ルーティングは、交換がメッセージを配置するキューを決定するプロセスです。すべてのメッセージを交換に公開しますが、メッセージはキューからしか受信しません。これは、交換が、メッセージの転送またはコピーに関するいくつかの決定を行うプロセスのアクティブな部分であることを意味します。

RabbitMQ に含まれるトピック交換は、受信メッセージの文字列 (routing_key) を調べ、交換からメッセージを受信するという希望を宣言するすべてのキューによって提供されるパターン (binding_keys) と照合します。

RabbitMQ のソース コードは Web 上にあるので、ここでトピック交換コードを見ることができます: http://hg.rabbitmq.com/rabbitmq-server/file/9b22dde04c9f/src/rabbit_exchange_type_topic.erl非常に高速なルックアップを可能にするトライと呼ばれるデータ構造を処理します。実際、同じデータ構造がインターネット ルーター内で使用されています。

ここにあるヘッダー交換 、おそらく理解しやすいでしょう。ご覧のとおり、異なるタイプの交換を行うために必要なコードはそれほど多くありません。コンテンツを調べたい場合 (または、メッセージの最初の数バイトだけをのぞき見したい場合)、XML と JSON とそれ以外のものをすばやく識別できるはずです。また、JSON オブジェクトと XML ドキュメントが特定の要素シーケンスを保持している場合は、メッセージ本文全体を解析せずに、異なる JSON オブジェクト (または XML doc タイプ) を区別できる必要があります。

于 2011-06-01T04:17:58.637 に答える