答えは「はい」ですが、それだけではありません... :)
まず、コンテンツベースのルーティングが何を意味するかについて同意しましょう。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 自体で新しい交換タイプを作成します。次に、クライアント セットアップ コードで、交換タイプを新しいタイプに定義します。
これがあなたの質問に答えることを願っています!