RabbitMQ Go客戶端教程6 RPC

2022-04-10 20:46:58 字數 3455 閱讀 7101

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

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

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

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

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

(使用go rabbitmq客戶端)

在第二個教程中,我們學習了如何使用工作佇列在多個worker之間分配耗時的任務。

但是,如果我們需要在遠端計算機上執行函式並等待結果怎麼辦?好吧,那是乙個不同的故事。這種模式通常稱為遠端過程呼叫或rpc。

在本教程中,我們將使用rabbitmq構建乙個rpc系統:客戶端和可伸縮rpc伺服器。由於我們沒有值得分配的耗時任務,因此我們將建立乙個虛擬rpc服務,該服務返回斐波那契數。

有關rpc的說明

儘管rpc是計算中非常常見的模式,但它經常受到批評。

當程式設計師不知道函式呼叫是本地的還是緩慢的rpc時,就會出現問題。這樣的混亂會導致系統變幻莫測,並給除錯增加了不必要的複雜性。濫用rpc可能會導致無法維護的義大利麵條式**而不是簡化軟體,

牢記這一點,請考慮以下建議:

q, err := ch.queuedeclare(

"", // 不指定佇列名,預設使用隨機生成的佇列名

false, // durable

false, // delete when unused

true, // exclusive

false, // nowait

nil, // arguments

)err = ch.publish(

"", // exchange

"rpc_queue", // routing key

false, // mandatory

false, // immediate

amqp.publishing)

訊息屬性

amqp 0-9-1協議預定義了訊息附帶的14個屬性集。除以下屬性外,大多數屬性很少使用:

在上面介紹的方法中,我們建議為每個rpc請求建立乙個**佇列。這是相當低效的,但是幸運的是,有一種更好的方法——讓我們為每個客戶端建立乙個**佇列。

這就引發了乙個新問題,在該佇列中收到響應後,尚不清楚響應屬於哪個請求。這個時候就該使用correlation_id這個屬性了。針對每個請求我們將為其設定乙個唯一值。隨後,當我們在**佇列中收到訊息時,我們將檢視該屬性,並基於這個屬性將響應與請求進行匹配。如果我們看到未知的correlation_id值,則可以放心地丟棄該訊息——它不屬於我們的請求。

你可能會問,為什麼我們應該忽略**佇列中的未知訊息,而不是報錯而失敗?這是由於伺服器端可能出現競爭狀況。儘管可能性不大,但rpc伺服器可能會在向我們傳送答案之後但在傳送請求的確認訊息之前死亡。如果發生這種情況,重新啟動的rpc伺服器將再次處理該請求。這就是為什麼在客戶端上我們必須妥善處理重複的響應,並且理想情況下rpc應該是冪等的。

我們的rpc工作流程如下:

斐波那契函式:

func fib(n int) int  else if n == 1  else 

}

宣告我們的斐波那契函式。它僅假設有效的正整數輸入。 (不要指望這種方法適用於大量使用者,它可能是最慢的遞迴實現)。

我們的rpc伺服器rpc_server.go的**如下所示:

}伺服器**非常簡單:

我們的rpc客戶端rpc_client.go的**:

}現在是時候看看rpc_client.go和rpc_server.go的完整示例源**了。

我們的rpc服務現已準備就緒。我們可以啟動伺服器:

go run rpc_server.go

# => [x] awaiting rpc requests

要請求斐波那契數,請執行客戶端:

go run rpc_client.go 30

# => [x] requesting fib(30)

這裡介紹的設計不是rpc服務的唯一可能的實現,但是它具有一些重要的優點:

我們的**仍然非常簡單,並且不會嘗試解決更複雜(但很重要)的問題,例如:

如果要進行實驗,可能會發現管理後台介面對於檢視佇列很有用。

RabbitMQ Go客戶端教程5 topic

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

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

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

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

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