RabbitMQ Go客戶端教程5 topic

2022-04-10 20:46:59 字數 3718 閱讀 1572

本文翻譯自rabbitmq官網的go語言客戶端系列教程,本文首發於我的個人部落格:liwenzhou.com,教程共分為六篇,本文是第五篇——topic。

這些教程涵蓋了使用rabbitmq建立訊息傳遞應用程式的基礎知識。

你需要安裝rabbitmq伺服器才能完成這些教程,請參閱安裝指南或使用docker映象。

這些教程的**是開源的,官方**也是如此。

本教程假設rabbitmq已安裝並執行在本機上的標準埠(5672)。如果你使用不同的主機、埠或憑據,則需要調整連線設定。

傳送到topic交換器的訊息不能具有隨意的routing_key——它必須是單詞列表,以點分隔。這些詞可以是任何東西,但通常它們指定與訊息相關的某些功能。一些有效的routing_key示例:「stock.usd.nyse」,「nyse.vmw」,「quick.orange.rabbit」。routing_key中可以包含任意多個單詞,最多255個位元組。

繫結鍵也必須採用相同的形式。topic交換器背後的邏輯類似於direct交換器——用特定路由鍵傳送的訊息將傳遞到所有匹配繫結鍵繫結的佇列。但是,繫結鍵有兩個重要的特殊情況:

通過下面這個示例可以很容易看明白這一點:

在這個例子中,我們將傳送一些都是描述動物的資訊。將使用包含三個詞(兩個點)的路由金鑰傳送訊息。路由鍵中的第乙個單詞將描述速度,第二個是顏色,第三個是種類:「..」。

我們建立了三個繫結關係:q1與繫結鍵「*.orange.*」繫結,q2與「*.*.rabbit」和「lazy.#」繫結。

這些繫結可以總結為:

路由鍵設定為「quick.orange.rabbit」的訊息將傳遞到兩個佇列。訊息「lazy.orange.elephant」也將傳送給他們兩個。另一方面,「quick.orange.fox」將僅進入第乙個佇列,而「lazy.brown.fox」將僅進入第二個佇列。即使「lazy.pink.rabbit」與兩個繫結匹配(匹配q2的兩個繫結),也只會傳遞到第二個佇列一次。 「quick.brown.fox」與任何繫結都不匹配,因此將被丟棄。

如果我們打破約定並傳送乙個或四個單詞的訊息,例如「orange」或「quick.orange.male.rabbit」,會發生什麼?好吧,這些訊息將不匹配任何繫結,並且將會丟失。

另外,「lazy.orange.male.rabbit」即使有四個單詞,也將匹配最後乙個繫結,並將其傳送到第二個佇列。

topic交換器

topic交換器功能強大,可以像其他交換器一樣執行。

當佇列用「#」(井號)繫結鍵繫結時,它將接收所有訊息,而與路由鍵無關,就像在fanout交換器中一樣。

當在繫結中不使用特殊字元「*」(星號)和「#」(井號)時,topic交換器的行為就像direct交換器一樣。

我們將在日誌記錄系統中使用topic交換器。我們將從乙個可行的假設開始,即日誌的路由鍵將包含兩個詞:「.」。

該**與上一教程中的**幾乎相同。

emit_log_topic.go的**:

}receive_logs_topic.go的**:

// 繫結topic

for _, s := range os.args[1:]

msgs, err := ch.consume(

q.name, // queue

"", // consumer

true, // auto ack

false, // exclusive

false, // no local

false, // no wait

nil, // args

)failonerror(err, "failed to register a consumer")

forever := make(chan bool)

go func()

}()log.printf(" [*] waiting for logs. to exit press ctrl+c")

}想要接收所有的日誌:

go run receive_logs_topic.go "#"
要從「kern」接收所有日誌:

go run receive_logs_topic.go "kern.*"
或者,如果你只想接收「critical」日誌:

go run receive_logs_topic.go "*.critical"
你可以建立多個繫結:

go run receive_logs_topic.go "kern.*" "*.critical"
並發出帶有路由鍵「kern.critical」的日誌:

go run emit_log_topic.go "kern.critical" "a critical kernel error"
你可以自己嘗試玩一下這個程式。請注意,**沒有對路由鍵或繫結鍵進行任何假設,你可能希望使用兩個以上的路由鍵引數。

(關於emit_log_topic.go和receive_logs_topic.go的完整源**)

接下來,我們將在教程6中了解如何將往返訊息用作遠端過程呼叫。

RabbitMQ Go客戶端教程6 RPC

本文翻譯自rabbitmq官網的go語言客戶端系列教程,本文首發於我的個人部落格 liwenzhou.com,教程共分為六篇,本文是第六篇 rpc。這些教程涵蓋了使用rabbitmq建立訊息傳遞應用程式的基礎知識。你需要安裝rabbitmq伺服器才能完成這些教程,請參閱安裝指南或使用docker映象...

瘦客戶端 胖客戶端 智慧型客戶端

胖客戶端模式將應用程式處理分成了兩部分 由使用者的桌面計算機執行的處理和最適合乙個集中的伺服器執行的處理。乙個典型的胖客戶端包含乙個或多個在使用者的pc上執行的應用程式,使用者可以檢視並運算元據 處理一些或所有的業務規則 同時提供乙個豐富的使用者介面做出響應。伺服器負責管理對資料的訪問並負責執行一些...

胖客戶端 瘦客戶端和富客戶端

以c s結構開發的網路應用程式,需要為客戶端開發專用的客戶端軟體,相對而言其客戶端比較龐大,在客戶端可以實現很多功能,分擔伺服器的負擔,屬於胖客戶端型別。以b s結構開發的web應用,其客戶端只是乙個瀏覽器,所有業務邏輯由伺服器端進行處理,相對而言客戶端比較瘦小,故稱為瘦客戶端。目前比較流行的一種開...