RabbitMQチュートリアル5-トピック

公式サイトのレッスン翻訳シリーズを続けています 。 例はphpですが、ほとんどの一般的な言語で実装できます。



前の記事で、ログシステムを改善しました。 ファンアウトアクセスポイント(メッセージの基本的なブロードキャストにのみ適しています)の代わりに、直接使用し、特定の選択を通じてメッセージを受信することができました。



ダイレクトはシステムを改善しましたが、まだ欠点があります-いくつかの基準に従ってルーティングを行うことができません。



たとえば、重要度の種類だけでなく、ログのソースによってもログを分離する必要がありました。 syslog unixツールでこのような概念に出くわすことでしょう。重要度の種類(info / warn / crit ...)とオブジェクト(auth / cron / kern ...)によってログを区別します。



リクエストに柔軟に対応します。 たとえば、cronからのエラータイプを持つすべてのログと、kernからのすべてのログを取得できます。 ロギングシステムにこれを実装するために、アクセスポイントのトピックを学習します。



トピック



トピックアクセスポイントに送信されるメッセージは、任意のrouting_keyで送信できません。これは、ドットで区切られた単語のリストである必要があります。 単語は任意ですが、通常はいくつかのメッセージプロパティに関連付けられています。 正しいrouting_keyの例を次に示します。「stock.usd.nyse」、「nyse.vmw」、「quick.orange.rabbit」。 キーの長さは255バイトを超えてはなりません。



バインドキーは同じルールに従って作成されます。 トピックのロジックは直接の場合と同じです。メッセージは、バインディングキーがメッセージのルーティングキーと一致するキューに到達します。 ただし、トピックには2つの特別な機能があります。



図に示すのがより明確になります。







この例では、与えられたすべての動物に手紙を送ります。 メッセージには、3つの単語(2つのドット)で構成されるルーティングキーが含まれます。 最初の単語は速度、2番目の色、3番目の種類は「speed.colour.species」です。



キューQ1はキー「* .orange。*」に関連付けられ、キューQ2はキー「*。*。Rabbit」および「lazy。#」に関連付けられます。



リンクは次のように要約できます。

  1. キューQ1は、すべてのオレンジ色の動物に関心があります。
  2. Q2ラインは、ウサギと怠zyな動物に関するすべてを知りたいと思っています。




キー「quick.orange.rabbit」を持つメッセージは両方のキューに届きます。 キー「lazy.orange.elephant」を持つメッセージも両方のキューに到着します。 タイプが「quick.orange.fox」のメッセージは1つのキューにのみ到達し、タイプが「lazy.brown.fox」のメッセージは2番目のキューにのみ到達します。 タイプが「lazy.pink.rabbit」のメッセージは、2つの接続に対応していますが、2行目に1回だけ到達します。 タイプが「quick.brown.fox」のメッセージは、キューに到達しません。



ルールに一致しないキーを使用してメッセージを送信するとどうなりますか:1語または4語(たとえば、「quick.orange.male.rabbit」)。 そのようなメッセージはどこにも来ず、去りません。



しかし、「lazy.orange.male.rabbit」というキーを持つメッセージは、4ワードで構成されていますが、最後の接続に対応しており、2番目に分類されます。



トピックは非常に強力なアクセスポイントです。 他のアクセスポイントと同様に機能します。 バインディングキーに「#」を入力すると、ファンアウトのように動作します。 また、シンボル「*」と「#」を使用しない場合、直接のように動作します。



合計



ロギングシステムにはトピックアクセスポイントを使用します。 ログのルーティングキーには「facility.severity」という2つの単語が含まれていると仮定します。 コードは前の記事とほとんど同じです。



スクリプトemit_log_topic.php(プロデューサー):

<?php require_once __DIR__ . '/vendor/autoload.php'; use PhpAmqpLib\Connection\AMQPConnection; use PhpAmqpLib\Message\AMQPMessage; $connection = new AMQPConnection('localhost', 5672, 'guest', 'guest'); $channel = $connection->channel(); $channel->exchange_declare('topic_logs', 'topic', false, false, false); $routing_key = $argv[1]; if(empty($routing_key)) $routing_key = "anonymous.info"; $data = implode(' ', array_slice($argv, 2)); if(empty($data)) $data = "Hello World!"; $msg = new AMQPMessage($data); $channel->basic_publish($msg, 'topic_logs', $routing_key); echo " [x] Sent ",$routing_key,':',$data," \n"; $channel->close(); $connection->close(); ?>
      
      





スクリプトreceive_logs_topic.php(サブスクライバー):



 <?php require_once __DIR__ . '/vendor/autoload.php'; use PhpAmqpLib\Connection\AMQPConnection; $connection = new AMQPConnection('localhost', 5672, 'guest', 'guest'); $channel = $connection->channel(); $channel->exchange_declare('topic_logs', 'topic', false, false, false); list($queue_name, ,) = $channel->queue_declare("", false, false, true, false); $binding_keys = array_slice($argv, 1); if( empty($binding_keys )) { file_put_contents('php://stderr', "Usage: $argv[0] [binding_key]\n"); exit(1); } foreach($binding_keys as $binding_key) { $channel->queue_bind($queue_name, 'topic_logs', $binding_key); } echo ' [*] Waiting for logs. To exit press CTRL+C', "\n"; $callback = function($msg){ echo ' [x] ',$msg->delivery_info['routing_key'], ':', $msg->body, "\n"; }; $channel->basic_consume($queue_name, '', false, true, false, false, $callback); while(count($channel->callbacks)) { $channel->wait(); } $channel->close(); $connection->close(); ?>
      
      





すべてを取得するには:



 $ php receive_logs_topic.php "#"
      
      





kernオブジェクトのすべてのログを取得するには:



 $ phpreceive_logs_topic.php "kern.*"
      
      





クリティカルタイプのログのみをリッスンする場合:



 $ php receive_logs_topic.php "*.critical"
      
      





複数の接続を作成します。



 $ php receive_logs_topic.php "kern.*" "*.critical"
      
      





「kern.critical」キーを持つメッセージを受信するには:



 $ php emit_log_topic.php "kern.critical" "A critical kernel error"
      
      





コードは、ルーティングキーとバインディングキーのルールを作成しないことに注意してください。 キーに3つ以上の単語を入力してみてください。



完全なスクリプトコードはemit_log_topic.phpおよびreceive_logs_topic.phpです。



All Articles