摘要:前提必讀本教程假設(shè)是安裝在標(biāo)準(zhǔn)端口上運(yùn)行。這些詞可以是任何東西,但通常它們指定連接到消息的某些特性。如果我們違背合同,用一個或四個詞,如或那么,這些消息將不匹配任何綁定并將丟失。代碼與前面的教程幾乎相同。
(using php-amqplib)
前提必讀本教程假設(shè)RabbitMQ是安裝在標(biāo)準(zhǔn)端口上運(yùn)行(5672)。如果您使用不同的主機(jī)、端口或憑據(jù),則連接設(shè)置需要調(diào)整。
在哪里得到幫助
如果您在本教程中遇到困難,可以通過郵件列表與我們聯(lián)系。
開始在前面的教程中,我們改進(jìn)了日志系統(tǒng)。我們使用的是一種直接廣播方式,而不是只使用一種直接(direct)廣播方式的fanout交換機(jī),從而獲得了有選擇地接收日志的可能性。
雖然使用直接direct交換機(jī)改進(jìn)了我們的系統(tǒng),但它仍然有局限性——它不能根據(jù)多個標(biāo)準(zhǔn)進(jìn)行路由。
在我們的日志系統(tǒng)中,我們可能希望訂閱基于嚴(yán)重性的日志,但也要基于發(fā)出日志的源。你可能從syslog UNIX工具知道這個概念,路由日志基于嚴(yán)重性(info/warn/crit…)和設(shè)備(auth/cron/kern…)。
這會給我們很大的靈活性,我們可能要聽關(guān)鍵的錯誤來自kern, 所有日志來自kern”。
為了在日志系統(tǒng)中實(shí)現(xiàn)這一點(diǎn),我們需要了解一個更復(fù)雜的主題topic交換機(jī)。
Topic exchange發(fā)送到一個話題交換機(jī)(topic exchange)信息,不能是任意routing_key -它必須是一個單詞的列表,用逗號分隔。這些詞可以是任何東西,但通常它們指定連接到消息的某些特性。一些有效的路由鍵的例子:stock.usd.nyse、nyse.vmw、"quick.orange.rabbit"。在你喜歡的路由鍵中,最多可以有255個字節(jié)的單詞。
綁定鍵也必須是相同的形式。主題交換背后的邏輯類似于一個直接的消息,用特定的路由鍵發(fā)送的消息將被發(fā)送到綁定到綁定鍵的所有隊(duì)列中。但是有兩個重要的綁定鍵的特殊情況:
*(星號)可以代替一個詞。
#(哈希)可以代替零個或更多的單詞。
在一個例子中解釋這一點(diǎn)是最容易的:
在這個示例中,我們將發(fā)送所有描述動物的消息。消息將用一個包含三個單詞(兩個點(diǎn))的路由鍵發(fā)送。路由鍵中的第一個字將描述速度,第二個顏色和第三個種:
我們創(chuàng)建三的綁定:Q1綁定綁定鍵*.orange.* 和 Q2 with *.*.rabbit 和 lazy.#。
這些綁定可以概括為:
Q1對所有的橙色(orange)動物很感興趣。
Q2想聽關(guān)于兔子(rabbits)的一切,關(guān)于懶惰(lazy)動物的一切。
帶有quick.orange.rabbit的路由鍵的消息將傳送到兩個隊(duì)列中。信息lazy.orange.elephant也將去他們倆。另一方面,quick.orange.fox只會進(jìn)入第一排,而lazy.brown.fox只到第二個。lazy.pink.rabbit將被送到第二個隊(duì)列只有一次,即使它匹配兩個綁定。quick.brown.fox不匹配任何綁定,所以它將被丟棄。
如果我們違背合同,用一個或四個詞,如orange或quick.orange.male.rabbit?那么,這些消息將不匹配任何綁定并將丟失。
另一方面,lazy.orange.male.rabbit,即使它有四個詞,將匹配最后的綁定,并將交付給第二個隊(duì)列。
Topic exchange匯總(Putting it all together)主題交換(Topic exchange)功能強(qiáng)大,可以像其他交換機(jī)一樣。
當(dāng)隊(duì)列綁定#(hash)綁定鍵-它將收到的所有郵件,不管路由關(guān)鍵一樣的fanout交換機(jī)。
當(dāng)特殊字符*(star)和#(hash)中不使用綁定,主題交換機(jī)會表現(xiàn)的像一個direct交換機(jī)。
我們將在日志系統(tǒng)中使用主題交換機(jī)(topic exchange)。我們將從一個工作假設(shè)開始,假設(shè)日志的路由鍵有兩個詞:
代碼與前面的教程幾乎相同。
emit_log_topic.php代碼:
channel(); $channel->exchange_declare("topic_logs", "topic", false, false, false); $routing_key = isset($argv[1]) && !empty($argv[1]) ? $argv[1] : "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," "; $channel->close(); $connection->close(); ?>
receive_logs_topic.php代碼:
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] "); 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", " "; $callback = function($msg){ echo " [x] ",$msg->delivery_info["routing_key"], ":", $msg->body, " "; }; $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:
php receive_logs_topic.php "kern.*"
或者,如果您只想聽關(guān)于critical的日志:
php receive_logs_topic.php "*.critical"
你可以創(chuàng)建多個綁定:
php receive_logs_topic.php "kern.*" "*.critical"
觸發(fā)一個日志來自路由鍵kern.critical類型
php emit_log_topic.php "kern.critical" "A critical kernel error"
這些程序讓我們覺得很好玩。請注意,代碼對路由或綁定鍵不作任何假設(shè),您可能希望使用兩個以上的路由鍵參數(shù)。
(全部源碼:emit_log_topic.php 和 receive_logs_topic)
接下來,了解如何通過一個遠(yuǎn)程過程調(diào)用來執(zhí)行往返消息,你可以閱讀下一章節(jié):RabbitMQ+PHP 教程六(RPC)。
翻譯來自 RabbitMQ - RabbitMQ tutorial - Topics
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/28315.html
摘要:我們以前的教程中的日志系統(tǒng)將所有消息廣播給所有消費(fèi)者。我們希望擴(kuò)展這一點(diǎn),允許基于其一定嚴(yán)重性程度來過濾消息。在這種情況下,交換機(jī)將表現(xiàn)為交換機(jī),并將消息發(fā)送到所有匹配隊(duì)列。 using php-amqplib 前提必讀 本教程假設(shè) RabbitMQ 是運(yùn)行在標(biāo)準(zhǔn)端口上運(yùn)行(5672). 如果您使用不同的主機(jī)、端口或憑據(jù),則連接設(shè)置需要調(diào)整。 如果您在本教程中遇到困難,可以通過郵件列...
摘要:單詞可以是任何東西,但通常它們指定了與該消息相關(guān)的一些功能。消息將使用由三個字兩個點(diǎn)組成的路由鍵發(fā)送。另一方面,只會進(jìn)入第一個隊(duì)列,而只會進(jìn)入第二個隊(duì)列。不匹配任何綁定,因此將被丟棄。代碼幾乎與前一個教程中的代碼相同。 源碼:https://github.com/ltoddy/rabbitmq-tutorial Topics (using the Pika Python client)...
摘要:在中間的框是一個隊(duì)列的消息緩沖區(qū),保持代表的消費(fèi)。本教程介紹,這是一個開放的通用的協(xié)議消息。我們將在本教程中使用,解決依賴管理。發(fā)送者將連接到,發(fā)送一條消息,然后退出。注意,這與發(fā)送發(fā)布的隊(duì)列匹配。 介紹 RabbitMQ是一個消息代理器:它接受和轉(zhuǎn)發(fā)消息。你可以把它當(dāng)作一個郵局:當(dāng)你把郵件放在信箱里時,你可以肯定郵差先生最終會把郵件送到你的收件人那里。在這個比喻中,RabbitMQ就...
閱讀 3570·2023-04-25 14:20
閱讀 1188·2021-09-10 10:51
閱讀 1150·2019-08-30 15:53
閱讀 456·2019-08-30 15:43
閱讀 2313·2019-08-30 14:13
閱讀 2791·2019-08-30 12:45
閱讀 1203·2019-08-29 16:18
閱讀 1159·2019-08-29 16:12