成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

rabbitmq中文教程python版 - Topics

ernest.wang / 3432人閱讀

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

源碼:https://github.com/ltoddy/rabbitmq-tutorial

Topics

(using the Pika Python client)

本章節(jié)教程重點介紹的內(nèi)容

在之前的教程中,我們改進(jìn)了日志記錄系統(tǒng)。我們沒有使用只有虛擬廣播的fanout交換,而是使用了direct交換,并讓選擇性接收日志成為了可能。

盡管使用direct交換改進(jìn)了我們的系統(tǒng),但它仍然有局限性 - 它不能根據(jù)多個標(biāo)準(zhǔn)進(jìn)行路由。

在我們的日志系統(tǒng)中,我們可能不僅需要根據(jù)嚴(yán)重性來訂閱日志,還要根據(jù)發(fā)布日志的來源進(jìn)行訂閱。您可能從syslog unix工具知道這個概念,
該工具根據(jù)嚴(yán)重性(info / warning / crit...)和工具(auth / cron / kern ...)來路由日志。

這會給我們很大的靈活性 - 因為我們可能想聽取來自"cron"的error日志,而且還聽取來自"kern"的所有日志。

為了在我們的日志系統(tǒng)中實現(xiàn)這一點,我們需要了解更復(fù)雜的topic交換。

Topic 交換

發(fā)送到topic交換的消息必須有規(guī)范的routing_key - 它必須是由點分隔的單詞列表。單詞可以是任何東西,但通常它們指定了與該消息相關(guān)的一些功能。
一些有效的routing_key例子: "stock.usd.nyse","nyse.vmw","quick.orange.rabbit"。只要您愿意,路由鍵中可以有任意的單詞,但最多255個字節(jié)。

綁定鍵也必須是相同的形式。topic交換背后的邏輯與direct topic交換背后的邏輯類似 - 使用特定路由鍵發(fā)送的消息將被傳遞到與匹配綁定鍵綁定的所有隊列。
但是綁定鍵有兩個重要的特殊情況:

* (star) 可以代替一個字。

# (hash) 可以替代零個或多個單詞。

在這個例子中解釋這個很簡單:

在這個例子中,我們將發(fā)送所有描述動物的消息。消息將使用由三個字(兩個點)組成的路由鍵發(fā)送。
路由關(guān)鍵字中的第一個單詞將描述速度,第二個顏色和第三個物種:" "。

我們創(chuàng)建了三個綁定:Q1綁定了綁定鍵" *.orange.* ",Q2綁定了" *.*.rabbit "和" lazy.#"。

這些綁定可以概括為:

Q1對所有的橙色動物都感興趣。

Q2希望聽到關(guān)于兔子的一切,以及關(guān)于懶惰動物的一切。

將路由鍵設(shè)置為"quick.orange.rabbit"的消息將傳遞到兩個隊列。消息"lazy.orange.elephant"也會去他們兩個。
另一方面,"quick.orange.fox"只會進(jìn)入第一個隊列,而"lazy.brown.fox"只會進(jìn)入第二個隊列。
"lazy.pink.rabbit"只會傳遞到第二個隊列一次,即使它匹配了兩個綁定。
"quick.brown.fox"不匹配任何綁定,因此將被丟棄。

如果我們違反我們的合同并發(fā)送帶有一個或四個單詞的消息,如"orange"或"quick.orange.male.rabbit",
會發(fā)生什么情況?那么,這些消息將不匹配任何綁定,并會丟失。

另一方面,"lazy.orange.male.rabbit"即使有四個單詞,也會匹配最后一個綁定,并將傳遞到第二個隊列。

direct change

  話題交換功能強大,可以像其他交流一樣行事。
  當(dāng)使用" # "(散列)綁定鍵綁定隊列時,它將接收所有消息,
  而不管路由密鑰如何 - 就像在*fanout*交換中一樣。
  當(dāng)在綁定中沒有使用特殊字符"*"(星號)和"#"(散列)時,主題交換將像*direct*交換一樣。
把它放在一起

我們將在我們的日志系統(tǒng)中使用topic交換。我們首先假定日志的路由鍵有兩個單詞:" . "。

代碼幾乎與前一個教程中的代碼相同 。

emit_log_topic.py的代碼:

#!/usr/bin/env python
import sys
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters("localhost"))
channel = connection.channel()

channel.exchange_declare(exchange="topic_logs",
                         exchange_type="topic")

routing_key = sys.argv[1:] if len(sys.argv) > 2 else "anonymous.info"
message = " ".join(sys.argv[2:]) or "Hello World"
channel.basic_publish(exchange="topic_logs",
                      routing_key=routing_key,
                      body=message)

print(" [x] Sent %r:%r" % (routing_key, message))
connection.close()

receive_logs_topic.py的代碼:

#!/usr/bin/env python
import sys
import pika

# connection = pika.BlockingConnection(pika.ConnectionParameters("localhost"))
connection = pika.BlockingConnection(pika.ConnectionParameters("172.17.0.2"))
channel = connection.channel()

channel.exchange_declare(exchange="topic_logs",
                         exchange_type="topic")

result = channel.queue_declare(exclusive=True)
queue_name = result.method.queue

binding_keys = sys.argv[1:]
if not binding_keys:
    sys.stderr.write("Usage: %s [binding_key]...
" % sys.argv[0])
    sys.exit(1)

for binding_key in binding_keys:
    channel.queue_bind(exchange="topic_logs",
                       queue=queue_name,
                       routing_key=binding_key)

print(" [*] Waiting for logs. To exit press CTRL+C")


def callback(ch, method, properties, body):
    print(" [x] %r:%r" % (method.routing_key, body))


channel.basic_consume(callback,
                      queue=queue_name,
                      no_ack=True)

channel.start_consuming()

要接收所有日志運行:

python receive_logs_topic.py "#"

要從設(shè)施“ kern ” 接收所有日志:

python receive_logs_topic.py "kern.*"

或者,如果您只想聽到關(guān)于“ critical ”日志的信息:

python receive_logs_topic.py "*.critical"

您可以創(chuàng)建多個綁定:

python receive_logs_topic.py "kern." ".critical"

發(fā)布帶有路由鍵“ kern.critical ”類型的日志:

python emit_log_topic.py "kern.critical" "A critical kernel error"

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/41439.html

相關(guān)文章

  • rabbitmq中文教程python - 介紹

    摘要:每當(dāng)我們收到一條消息,這個回調(diào)函數(shù)就被皮卡庫調(diào)用。接下來,我們需要告訴這個特定的回調(diào)函數(shù)應(yīng)該從我們的隊列接收消息為了讓這個命令成功,我們必須確保我們想要訂閱的隊列存在。生產(chǎn)者計劃將在每次運行后停止歡呼我們能夠通過發(fā)送我們的第一條消息。 源碼:https://github.com/ltoddy/rabbitmq-tutorial 介紹 RabbitMQ是一個消息代理:它接受和轉(zhuǎn)發(fā)消息。你...

    yimo 評論0 收藏0
  • rabbitmq中文教程python - 工作隊列

    摘要:我們將任務(wù)封裝為消息并將其發(fā)送到隊列。為了確保消息永不丟失,支持消息確認(rèn)。沒有任何消息超時當(dāng)消費者死亡時,將重新傳遞消息。發(fā)生這種情況是因為只在消息進(jìn)入隊列時調(diào)度消息。這告訴一次不要向工作人員發(fā)送多個消息。 源碼:https://github.com/ltoddy/rabbitmq-tutorial 工作隊列 showImg(https://segmentfault.com/img/r...

    tabalt 評論0 收藏0
  • rabbitmq中文教程python - 發(fā)布 / 訂閱

    摘要:交易所在本教程的前幾部分中,我們發(fā)送消息并從隊列中接收消息。消費者是接收消息的用戶的應(yīng)用程序。中的消息傳遞模型的核心思想是生產(chǎn)者永遠(yuǎn)不會將任何消息直接發(fā)送到隊列中。交換和隊列之間的關(guān)系稱為綁定。 源碼:https://github.com/ltoddy/rabbitmq-tutorial 發(fā)布 / 訂閱 (using the Pika Python client) 本章節(jié)教程重點介紹的...

    alphahans 評論0 收藏0
  • rabbitmq中文教程python - 路由

    摘要:為了避免與參數(shù)混淆,我們將其稱為綁定鍵。直接交換我們之前教程的日志記錄系統(tǒng)將所有消息廣播給所有消費者。在這種設(shè)置中,使用路由鍵發(fā)布到交換機的消息將被路由到隊列。所有其他消息將被丟棄。 源碼:https://github.com/ltoddy/rabbitmq-tutorial 路由 本章節(jié)教程重點介紹的內(nèi)容 在之前的教程中,我們構(gòu)建了一個簡單的日志系統(tǒng) 我們能夠?qū)⑷罩鞠V播給許多接收...

    Hwg 評論0 收藏0
  • rabbitmq中文教程python - 遠(yuǎn)程過程調(diào)用

    摘要:通常用于命名回調(diào)隊列。對每個響應(yīng)執(zhí)行的回調(diào)函數(shù)做了一個非常簡單的工作,對于每個響應(yīng)消息它檢查是否是我們正在尋找的。在這個方法中,首先我們生成一個唯一的數(shù)并保存回調(diào)函數(shù)將使用這個值來捕獲適當(dāng)?shù)捻憫?yīng)。 源碼:https://github.com/ltoddy/rabbitmq-tutorial 遠(yuǎn)程過程調(diào)用(RPC) (using the Pika Python client) 本章節(jié)教程...

    chuyao 評論0 收藏0

發(fā)表評論

0條評論

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