RabbitMQ是大家經常使用的消息中間件,本篇就來談談RabbitMQ架構
RabbitMQ
RabbitMQ是一種開源消息中間件,使用Erlang語言進行開發,實作了進階消息隊列協定(AMQP)。
AMQP代表進階消息隊列協定,是一個開放的應用層協定标準,用于設計面向消息的中間件。
Erlang語言主要用于開發并發和分布式系統,在電信領域得到廣泛應用。除此之外,還有一些基于Erlang開發的中間件和工具庫,如OTP(Open Telecom Platform)。
(此處已添加書籍卡片,請到今日頭條用戶端檢視)
RabbitMQ特點
1.可靠性:RabbitMQ采用一系列機制來確定消息的可靠性,如持久化、傳輸确認和釋出确認等方法。
2.靈活的路由:消息在進入隊列之前會通過交換器進行路由,使得消息能夠按照特定的規則進行分發。
3.可擴充性:RabbitMQ支援建構叢集,多個節點可以組成一個叢集,并可以根據實際業務需求動态地擴充叢集中的節點。
4.高可用性:隊列可以在叢集的多台機器上進行鏡像設定,即使其中的某些節點出現故障,隊列仍然可用。
5.多種協定:RabbitMQ不僅原生支援AMQP協定,還支援其他多種消息中間件協定,如STOMP、MQTT等。
6.多語言用戶端:RabbitMQ提供了廣泛的語言用戶端支援,幾乎涵蓋了所有常用程式設計語言,包括Java、Python、Ruby、PHP、C#、JavaScript等。
RabbitMQ架構設計
RabbitMQ架構,如下圖所示:
RabbitMQ架構會涉及如下模型:Producer、Consumer、Queue、Exchange、Broker、RoutingKey、BindingKey。
RabbitMQ架構模型
1.Producer
消息生産者Producer:主要就是生成消息,通過信道(Channel),把消息發送給交換機(Exchange)。
消息通常由兩個主要部分組成:
- 消息内容(Payload):一般是包含業務邏輯結構的資料,例如 JSON 格式的字元串。
- 消息辨別(Label):用于描述消息的資訊,比如交換器的名稱和路由鍵等。
這兩個部分共同構成了消息的内容和描述,使得消息能夠被正确地路由和處理。
2.Consumer
消息消費者是指用于接收消息的程式。
消費者會監聽RabbitMQ中的隊列(Queue),并從隊列中擷取消息進行消費。
需要注意的是,消息會一直保留在隊列中,直到被消費者接收和處理。
3.Queue
用于存儲消息,如下圖所示:
RabbitMQ的生産者負責生成消息并将其傳遞到隊列中,而消費者則從隊列中擷取消息并進行消費。
在RabbitMQ中,消息隻能存儲在隊列中,這與像Kafka這樣的消息中間件相反。
多個消費者可以訂閱同一個隊列,這樣隊列中的消息會被平均配置設定給各個消費者進行處理。
如下圖所示:
4.Exchange
生産者将消息發送到Exchange,由交換器将消息路由到一個或者多個隊列中。
如下圖所示:
這裡的消息路由機制涉及到以下四種類型:
- 直連路由(Direct);
- 扇形廣播路由(Fanout);
- 主題路由(Topic);
- 消息頭路由(Headers);
每種類型的路由都有不同的政策用于确定消息的傳遞方式。
5.Broker
可以将一個RabbitMQ Broker看作一台RabbitMQ伺服器,如下圖所示:
上圖展示了消息從生産者存入RabbitMQ Broker,以及消費者從Broker中消費資料的完整過程。
6.Routing Key
生産者将消息發給交換器的時候,一般會指定一個 RoutingKey,用來指定這個消息的路由規則。
如下圖所示:
生産者可以在發送消息給交換器時,通過指定 RoutingKey 來決定消息流向哪裡。
7.BindingKey
在 RabbitMQ 中,通過綁定操作将交換器與隊列進行關聯。在綁定時,通常會指定一個綁定鍵(BindingKey),這樣 RabbitMQ 就能夠根據綁定鍵正确地将消息路由到相應的隊列中。這種綁定關系的建立可以靈活地控制消息的路由行為。
(此處已添加書籍卡片,請到今日頭條用戶端檢視)