前言
RabbitMQ 和很多訊息中介軟體技術一樣,主要是為了解決分散式架構系統中系統和系統之間的通訊問題
RabbitMQ 是基於 AMQP 協議進行通訊的,AMQP協議是在 TCP/IP協議之上的協議。為什麼不使用 HTTP 協議,是因為 HTTP 協議相對而言太過複雜,有cookie,加密,等等一系列資訊,傳輸效率比較低,並且 大部分情況下,HTTP協議都是短連線,無法保證資料的完整和不具有持久化的功能。所以RabbitMQ就制定了自己的一套協議,AMQP協議。
RabbitMQ 是基於channel 通道處理,不是基於連線,因為連線開關是短連線,並且耗時長,經過三次握手四次揮手
如何保證消費者可靠的消費訊息,用ack機制,手動消費nack完成
RabbitMQ 可以存在沒有交換機的佇列麼,不能,雖然沒有指定交換機,但是會存在一個預設的交換機,訊息都是通過交換機傳遞給佇列的
虛擬機器節點主要是用於隔離和區分
優缺點
1、避免系統底層複雜性即解耦:優點很明顯,因為 RabbitMQ 是用來處理系統之間的通訊的,所以是避免了系統底層的複雜性,使系統的可擴充性更強,只需要遵循 AMQP 協議,系統無論是使用Java還是PHP還是其它語言開發,都可以互相通訊。
2、削峰:例如在當一個系統在其它時間段每秒都只有幾百的資料請求,這個時候資料等壓力都很小,當中午時間段請求突然增大增加到六千每秒的請求,這個時候RabbitMQ作用就起到的很大的作用
3、持久化:當RabbitMQ當機前,訊息都會持久化。
4、高可用、高併發:支援分散式,支援併發請求。
對比
除了 RabbitMQ 訊息中介軟體還有很多其它類似的中介軟體技術例如 ActiveMQ,RocketMQ,Kafka 等。相比於其它訊息中介軟體,RabbitMQ 優勢在於他的訊息分發機制完善,支援訊息的訂閱分發,公平分發,輪訓分發,重發和訊息的拉取等機制。RabbitMQ底層是使用 erlang 語言編寫的,而erlang底層是 C 語言編寫的,所以RabbitMQ的效能和併發能力很強。Kafka是基於Java 編寫的,使用的是 Kafka 通訊協議,是給予 TCP/IP 協議上進行的,直接將通訊連線和資料轉化為二進位制,效能很強。但是在分散式架構中,最大的痛點就是不支援事務,所以一般Kafka在大資料領域中使用廣泛,專門用來處理資料的分發。
擴充套件
Redis 也是一款效能極強的訊息中介軟體,而且也具有資料持久化的功能,但是為什麼還需要有 RabbitMQ 等其它訊息中介軟體。
因為 Redis 的持久化有兩種方式,一個是 RDB(Redis DataBase) 一個是 AOF(append only file),RDB 持久化可以在指定的時間間隔內生成資料集的快照,AOF 是通過記錄伺服器所有寫操作命令,並再伺服器啟動時,通過重新執行這些命令來還原資料集。
缺點是 RDB 的時間差會導致很多資料的丟失,AOF一般檔案大於RDB,而且可能會出現無法將資料集恢復成原來的樣子的問題。
訊息分發策略
訊息機制 |
ActiveMQ |
RabbitMQ |
Kafka |
RocketMQ |
釋出訂閱 |
支援 |
支援 |
支援 |
支援 |
輪詢分發 |
支援 |
支援 |
支援 |
/ |
公平分發 |
/ |
支援 |
支援 |
/ |
重發 |
支援 |
支援 |
/ |
支援 |
訊息拉取 |
/ |
支援 |
支援 |
支援 |
釋出訂閱:生產者產生100條訊息,每個消費者都會收到100條訊息
輪詢分發:假如生產者產生100條訊息,如果有三個消費者,可能消費的順序不固定,但是最終每個消費者至少都會消費 33 條訊息,不會產生資料傾斜,使用RabbitMQ的自動應答就可以實現。
公平分發:根據消費的伺服器的效能來進行訊息的分發,會產生資料傾斜,而且必須進行手動應答。和輪詢分發一樣,一個訊息不會被第二次消費。
重發:顧名思義,在分散式系統中,如果有多個訂單系統,如果建立訂單的訊息分發給其中一個系統失敗,會分發給其它系統。
訊息拉取:消費者主動拉取,但是一般很少用到。
高可用和高可靠
高可用
所謂高可用就是指產品在規定的條件和規定的時刻或時間內處於可執行規定功能狀態和能力。當業務量增加時,請求也過大,一臺訊息中介軟體伺服器會觸及硬體(CPU,記憶體,磁碟)的極限,一臺訊息伺服器已經無法滿足業務的需求,所以訊息中介軟體必須支援叢集部署來達到高可用目的。
所有的叢集模式,終歸三句話
要麼訊息共享
要麼訊息同步
要麼後設資料共享
高可靠
所謂高可靠就是指,系統可以無故障低持續執行,比如一個系統突然奔潰,報錯,異常等並不影響線上業務的正常執行,出錯的機率基地,稱之為可靠。
再高併發的業務場景中,如果不能保證系統的高可靠,那造成的隱患和損失是非常嚴重的。
如何保證中間訊息的可靠性?從兩個方面考慮
1:訊息的傳輸:通過洗衣來保證系統間資料解析的正確性
2:訊息的儲存可靠:通過持久化來保證訊息的可靠性。
本作品採用《CC 協議》,轉載必須註明作者和本文連結