使用 RabbitMQ 提升效能和可擴展性的路由拓撲
為高擴展性系統設計良好的路由拓撲就像繪製圖表。 需要考慮許多事項,例如問題、環境限制、消息傳遞實作的限制以及效能策略。 我們經常遇到的問題是缺乏靈活性和表達能力來滿足我們對路由的需求。 這就是 RabbitMQ 的優勢所在。
基本概念
任何熟悉一般消息傳遞的人都知道將消息從 A 路由到 B 的概念。路由可以很簡單也可以很複雜,並且在為可擴展的複雜系統設計路由拓撲時,它必須優雅。 保持清潔和解耦,組件可以很好地隨著不同的負載而節流。 這可以表示為一個簡單的地圖或複雜的圖表。 以最簡單的形式,路由拓撲可以表示為節點,例如分層節點對於那些不熟悉 RabbitMQ 或 AMQP 的人(請注意,Rabbit 適用於許多協議,包括 STOMP、HTTP、HTTPS、XMPP 和 SMTP),以下是一些基本組件描述- 交換器 (Exchange) 伺服器中接收來自生產者應用程式的消息,並可選擇將這些消息路由到伺服器內消息佇列的實體
- 交換器類型 (Exchange type) 特定交換器模型的演算法和實作。 與「交換器實例」形成對比,「交換器實例」是在伺服器中接收和路由消息的實體
- 消息佇列 (Message queue) 一個具名實體,用於保存消息並將其轉發到消費者應用程式
- 繫結 (Binding) 一個在消息佇列和交換器之間建立關係的實體
- 路由金鑰 (Routing key) 交換器可以用來決定如何路由特定消息的虛擬位址
api.agents.agent-{id}.operations.{operationName}
在更複雜的情況下,路由金鑰可以與消息標頭欄位和/或其內容上的路由相結合。 交換器檢查消息的屬性、標頭欄位、正文內容,以及可能來自其他來源的資料,然後決定如何路由消息。 從上述路由金鑰概念派生的繫結模式可能如下所示: api.agents..operations.
,我們使用繫結模式 api.agents..operations.
將交換器 E1
繫結到佇列 Q1
,以便發送到 E1
的任何消息都路由到 Q1
……