RabbitMQ知識總結
AMQP協議
三層協議
- Module Layer:決定基本域模型所產生的行為,主要定義了一些供客戶端調用的命令,客戶端可以利用這些命令實現自己的業務邏輯。
- Session Layer:主要負責將客戶端的命令發送給服務器,再將服務端的應答返回給客戶端,主要為客戶端和服務器之間通信提供可靠性、同步機制和錯誤處理。
- Transport Layer:主要用於二進制數據流的傳輸。
RabbitMQ
- Broker:接收和分發消息的應用,像是RabbitMQ、ZeroMQ或者Redis等等。
- Connection:publisher/consumer和Broker之間的TCP連接
- Channel:兩個AMQP結點之間雙向通信流,通道是多路復用的,因此單個網絡連接可以支撐多個通道,各個通道之間是相互隔離的,其極大的減少了操作系統建立多個TCP連接的開銷。
- Message:消息
- Exchange:服務器中接收來自生產者程序的消息的實體,並可選擇將這些消息路由到服務器中的消息隊列中
- Message queue:保存消息並將它們轉發給消費者
- Routing key:一個虛擬地址,虛擬機可用它來確定如何路由一個特定消息
交換機
屬性
類型
Direct:Message中的routing key 如果和Binding中的 binding key一致的話,則Exchange會將Message散發到對應的Message queue中。
在默認的情況下創建的就是該類型的exchange,通常使用在需要發送消息到具體的隊列的情況,比如下面這張圖中,最后交換機會將消息路由到名字為green的消息隊列中。
Fanout:Exchange會將所有的Message散發到關聯的Message queue中。
即便是已經提供了routing key,該類型交換機也會忽略掉,並且將消息發送到所有關聯的隊列中,通常用來實現發布/訂閱模式,比如說體育新聞網站可以用它來近乎實時地將比分更新分發給移動客戶端,分發系統使用它來廣播各種狀態和配置更新等等。
Topic:根據正則表達式將Message散發到匹配的Message queue中。
比如在下圖中,根據Routing key
first.green.fast
能夠匹配到的隊列有.green.
和.*.fast
,該模式主要用來實現消息多播路由。比如說分發有關於特定地理位置的數據,例如銷售點,涉及到分類或者標簽的新聞更新(例如,針對特定的運動項目或者隊伍)等等。Headers:類似於Direct,但是當涉及到多個屬性的時候,一個Routing key 無法完全表達,其只能是個字符串,而多屬性需要使用到多個鍵值對表示,因此使用消息屬性來代替路由鍵作為路由規則,通過判斷消息頭中的值來和隊列中的值來確定消息的路由位置。
如果x-match為any的時候, 表示消息頭的任意一個值被匹配后就可以滿足條件,而當x-match為 all的時候,表示消息頭的所有的值都需要被匹配到才能滿足條件,比如在下圖中,因為第一個隊列為any,並且存在匹配的值,所以可以路由到綠色的路由中,因為第三個隊列為all,消息頭並沒有都匹配所有的鍵值對,因此消息只會發送到綠色的消息隊列中。
隊列
消息
消息確認
拒絕消息
預取
連接和通道
使用
比較
功能 | RabbitMQ | ZeroMQ |
---|---|---|
消息持久化 | 支持 | 不支持 |
事務 | 支持 | 不支持 |
類似 | 郵箱 | socket |
性能 | 低 | 高 |
穩定性 | 高 | 不穩定 |
支持AMQP協議 | 支持 | 不支持 |
適用場景 | 不允許數據丟失 | 高吞吐 |