什麼是 RabbitMQ?
在任何雲端原生應用程式中,微服務都必須進行通訊,才能取得回應使用者所需的所有資訊。 即使整合之間發生網路問題或失敗,您也應該確保此訊息中心是強固的。 RabbitMQ 是可用來提高傳訊可靠性的工具。
在您的戶外設備零售商店中,您的微服務正取得快速進展。 不過,在應用程式測試中,某個微服務對另一個微服務的一些呼叫似乎會遺失。 您想要確保您的實際執行環境中不會發生此問題,因為您公司的聲譽正處於緊要關頭。
在此單元中,您將了解 RabbitMQ 如何為微服務建立彈性且具有復原性的通訊平台。
為何在雲端原生應用程式中使用訊息代理程式?
雲端原生應用程式是由獨立的微服務所組成,通常由不同的小組所建置,並使用不同的技術和語言。 每個小組都有自己的開發短期衝刺和升級排程,而且可能會持續部署修正程式和新功能。 不過,當來自使用者的要求抵達時,接收要求的微服務幾乎都必須呼叫其他微服務和備份服務,並接收這些服務的回覆來制定完整的回應。
顯然,開發小組之間必須同意這些服務間的要求和回應格式與結構描述,而且很少變更。 這些通常會實作為 REST API。 您應該優先實作每個介面的新功能,但不改變現有的方法和參數。 不過,如果您選擇讓微服務直接通訊,可能會引發數個問題:
- 當目的地微服務離線或忙碌時,傳送至其中的訊息會發生什麼情況? 訊息遺失的後果為何?
- 如何將相同的訊息傳送至多個目的地?
- 如果微服務在多個容器上執行,您應該將訊息傳送至哪一個容器?
訊息代理程式是解決這些問題的中介軟體。 服務會將訊息傳送至訊息代理程式,而不是直接傳送至目的地。 訊息代理程式會依訊息到達的順序,將訊息儲存在佇列中。 目的地服務會訂閱這些佇列,並一次挑選一個訊息進行處理。
如果目的地服務無法使用,傳送微服務仍然可以將訊息放在佇列中。 當目的地重新啟動時,就會從佇列中擷取訊息 (從相同位置)。 雖然傳送者必須等候較長的時間,但不會遺失任何訊息。
因為不只一個目的地可以訂閱佇列,所以單一訊息可由多個微服務接收。 此外,當多個容器都裝載單一微服務的執行個體時,會由可供使用的第一個執行個體挑選訊息。 訊息代理程式會自動將訊息散發至執行個體,以分散負載。
什麼是 RabbitMQ?
RabbitMQ 是最熱門的訊息代理程式之一,具有許多功能,使其成為在雲端原生應用程式中處理通訊的理想候選項目。 包括:
- 裝載佇列的 RabbitMQ 伺服器。 伺服器支援叢集和容錯移轉,具備高可用性且可以在容器中執行。
- 進階訊息佇列通訊協定 (AMQP)、簡單文字導向消訊息協定 (STOMP) 和訊息佇列遙測傳輸 (MQTT) 的實作。
- 您可以在 .NET、Java 和 Erlang 中使用的 AMQP 用戶端程式庫。
RabbitMQ 概念
在 RabbitMQ 術語中,您用於傳送和接收訊息的微服務就是用戶端。 傳送訊息的用戶端稱為訊息產生者。 接收訊息的用戶端是訊息取用者。 RabbitMQ 服務是訊息代理程式。
如何傳送訊息
RabbitMQ 具備許多功能且能夠實作許多不同的佇列模型。 讓我們來查看一些熱門模式。
如果您有單一生產者和單一取用者,您可以使用單一佇列,所有訊息都會到達相同的目的地。 即使在這個簡單的組態中,您也會建置強固的傳訊系統,以順暢地處理中斷情況:
將訊息傳送給競爭取用者
在競爭取用者模型中,生產者會將訊息傳送至單一工作佇列。 兩個或多個取用者會從佇列擷取訊息。 取用者會爭相擷取訊息,因為每個訊息只能由單一取用者擷取。
當您在多個容器上裝載取用微服務來提升容量時,此模式在雲端原生應用程式中很有用。 每個訊息只會到達取用者的一個執行個體,因此只會處理一次。 工作將不會重複。
發佈和訂閱
如果您想要將單一訊息從產生者傳送至多個取用者,請使用發佈/訂閱模型。 產生者會將訊息傳送至交換。 每個取用者都會訂閱來自該交換的訊息。 當他們訂閱時,RabbitMQ 就會為該訂閱建立新的工作佇列。 每個訊息都會複製到該交換的每個佇列,並由已訂閱的每個取用者接收。 取用者不會爭相取用每個訊息。 而是會收到每個訊息的複本。
發佈/訂閱模型會使用扇出交換,將每個訊息複製到每個工作佇列。
當您想要讓多個微服務處理每個訊息時,此模式很有用。 例如,當客戶結帳購物籃的商品時,您可能會想要傳送一則訊息,列出他們購買的每個產品數目。 此訊息應同時送達出貨微服務,以指示倉儲包裝包裹,以及送達庫存微服務,以遞減庫存數量,並且可能會觸發供應商的訂單。
路由訊息與主題
有時候您想要將單一訊息散發給多個取用者,但針對每個取用者套用篩選。 此模式稱為訊息路由器。 如同發佈/訂閱模型中,取用者會訂閱交換以建立多個工作佇列。 不過,不同於扇出交換,此模型會使用直接交換。 使用此交換時,每個訂閱都會有繫結金鑰。 只有其路由金鑰符合繫結金鑰的訊息才會傳送至此訂閱。 其他則會篩選掉。
當某些取用者只應處理一小部分訊息串流時,此模式很有用。 例如,假設您有一個微服務,可在發生錯誤時傳送訊息。 所有錯誤都應該傳送至記錄微服務。 重大錯誤應傳送至系統管理微服務,以提醒工程師修正問題。
直接交換會根據單一準則路由訊息。 若要讓事情更具彈性,您可以使用主題交換。 針對每個訊息,您可以使用路由金鑰搭配以點分隔的多個詞彙。 在繫結索引鍵中,您可以使用萬字元 * 來取代完全相同的一個字組,或以 # 取代零或多個字組。
注意
RabbitMQ 的替代方案包括 Apache Kafka 和 Azure 服務匯流排。 這兩個訊息代理程式都受到 .NET Aspire 中專用整合的支援。 您將在此學習路徑的稍後課程模組中了解 Azure 服務匯流排。
深入了解
- RabbitMQ 教學課程
- .NET Aspire RabbitMQ 整合 (部分內容可能是機器或 AI 翻譯)
- .NET Aspire Apache Kafka 整合