国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

RabbitMQ+PHP 教程五(Topics)

nemo / 2986人閱讀

摘要:前提必讀本教程假設(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 *.*.rabbitlazy.#。

這些綁定可以概括為:

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不匹配任何綁定,所以它將被丟棄。

如果我們違背合同,用一個或四個詞,如orangequick.orange.male.rabbit?那么,這些消息將不匹配任何綁定并將丟失。

另一方面,lazy.orange.male.rabbit,即使它有四個詞,將匹配最后的綁定,并將交付給第二個隊(duì)列。

Topic exchange

主題交換(Topic exchange)功能強(qiáng)大,可以像其他交換機(jī)一樣。

當(dāng)隊(duì)列綁定#(hash)綁定鍵-它將收到的所有郵件,不管路由關(guān)鍵一樣的fanout交換機(jī)。

當(dāng)特殊字符*(star)和#(hash)中不使用綁定,主題交換機(jī)會表現(xiàn)的像一個direct交換機(jī)。

匯總(Putting it all together)

我們將在日志系統(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

相關(guān)文章

  • RabbitMQ+PHP 教程四(Routing)

    摘要:我們以前的教程中的日志系統(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)整。 如果您在本教程中遇到困難,可以通過郵件列...

    pinecone 評論0 收藏0
  • rabbitmq中文教程python版 - Topics

    摘要:單詞可以是任何東西,但通常它們指定了與該消息相關(guān)的一些功能。消息將使用由三個字兩個點(diǎn)組成的路由鍵發(fā)送。另一方面,只會進(jìn)入第一個隊(duì)列,而只會進(jìn)入第二個隊(duì)列。不匹配任何綁定,因此將被丟棄。代碼幾乎與前一個教程中的代碼相同。 源碼:https://github.com/ltoddy/rabbitmq-tutorial Topics (using the Pika Python client)...

    ernest.wang 評論0 收藏0
  • RabbitMQ+PHP 教程一(Hello World)

    摘要:在中間的框是一個隊(duì)列的消息緩沖區(qū),保持代表的消費(fèi)。本教程介紹,這是一個開放的通用的協(xié)議消息。我們將在本教程中使用,解決依賴管理。發(fā)送者將連接到,發(fā)送一條消息,然后退出。注意,這與發(fā)送發(fā)布的隊(duì)列匹配。 介紹 RabbitMQ是一個消息代理器:它接受和轉(zhuǎn)發(fā)消息。你可以把它當(dāng)作一個郵局:當(dāng)你把郵件放在信箱里時,你可以肯定郵差先生最終會把郵件送到你的收件人那里。在這個比喻中,RabbitMQ就...

    silencezwm 評論0 收藏0

發(fā)表評論

0條評論

nemo

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<