分布式通信:訊息佇列
什么是訊息佇列?
佇列是一種具有先進先出特點的資料結構,訊息佇列是基于佇列實作的、存盤具有特定格式的訊息資料,訊息以特定格式放入這個佇列的尾部后直接回傳,不需要系統馬上處理,之后有其他行程從佇列頭部開始讀取訊息,按照訊息放入順序逐一處理,
引入訊息佇列的好處是可以提升回應速度,實作組件之間的解耦,
訊息佇列的作業原理
訊息佇列模式包括3個核心部分:
- 生產者,產生訊息或者資料,并將其插入到訊息佇列中,
- 訊息佇列,一種具有先進先出特點的資料結構,用來存盤訊息,
- 消費者,從訊息佇列中獲取訊息,進行相關處理,
生產者將發送的訊息插入到訊息佇列,稱為入隊,消費者從訊息佇列中按照順序取出訊息進行處理,稱為出隊,
RocketMQ作業原理
RocketMQ的架構圖如下所示,

RocketMQ架構包括4部分:
- NameServer Cluster,它和Kafka中的ZooKeeper類似,提供分布式服務的協同和管理功能,主要是和Broker相關的資訊,包括有哪些Broker、Broker地址和狀態等,以方便生產者基于它來發布訊息,消費者基于它來獲取訊息,
- Producer Cluster,負責接收用戶資料,然后將資料發布到訊息佇列Broker Cluster,一般采用集群方式部署,這樣可以1)多個Producer并發接收用戶輸入資料,提升系統效率,2)增加可靠性,
- Consumer Cluster,負責從Broker中獲取訊息進行消費,一般也是采用集群方式部署,這樣可以提升消費者的消費能力,避免訊息溢位或者丟棄,
- Broker Cluster,負責存盤Producer Cluster發布的訊息,并供消費者消費,Broker Cluster中的每個Broker都進行了主從設計,即每個Broker分為Broker Master和Broker Slave,Master既可以寫也可以讀,Slave不可以寫只可以讀,Broker Master會把接收到的訊息同步給Broker Slave,以實作資料備份,一旦Broker Master崩潰,可以切換到Broker Slave繼續提供服務,這樣就提高了系統可靠性,
在Broker Cluster中,訊息的存盤采用主題(Topic)+ 訊息佇列(Queue)的方式實作,
RocketMQ中的主題是一個邏輯概念,一個主題可以磁區,分布在不同的Broker上,每個Broker只有該主題的部分資料,每個主題磁區中,佇列的數量可以不同,由用戶在創建主題時指定,佇列是資源分配的基本單元,訊息進行存盤時會存放到相應主題的磁區中,
RocketMQ的作業流程如下:
- 首先啟動NameServer,然后啟動Broker,Broker啟動后,會主動找NameServer建立連接,并將自己的資訊注冊到NameServer上,注冊完畢后,Broker會定期給NameServer發送心跳包,心跳包中除了狀態資訊外,還可以包括Broker當前存盤的資料資訊,
- 創建主題,并確定這個主題的資料存盤到哪些Broker上,
- 當Producer生產訊息發送到主題時,需要先到NameServer查詢該主題存放在哪些Broker中,獲取到Broker資訊后,將訊息發送給這些Broker進行存盤,
- Consumer要從主題消費訊息,也需要首先到NameServer查詢一下該主題的訊息存盤在哪些Broker上,然后去相應的Broker獲取訊息進行消費,
訊息佇列模式是根據消費者需求到訊息佇列獲取資料進行消費的,消費者只需要知道訊息佇列地址,訊息佇列中心無需提前知道消費者資訊,因此,訊息佇列模式比較適合消費者為臨時用戶的場景,
發布訂閱模式和訊息佇列模式的區別
首先,從實作解耦的資料結構看:
- 發布訂閱模式采用了訊息中心,訊息佇列模式采用了訊息佇列,它們都是用來存盤生產者發布的資料,都有Topic、Broker等概念,
- 發布訂閱采用map或者陣列等方式存盤資料,訊息佇列采用佇列結構來存盤資料,
其次,從實作解耦方式來看:
- 訊息佇列模式中,生產者發布資料到訊息佇列中心,訊息佇列中心會存盤資料,等待消費者按需獲取資料,這樣生產者就不需要和消費者進行直接通信,實作了生產者和消費者的解耦,
- 發布訂閱模式中,消費者需要提前向訊息中心訂閱自己感興趣的資料,當生產者發布資料到訊息中心后,訊息中心根據訂閱者訂閱資訊講資料主動推送給消費者,實作了生產者和消費者的解耦,
訊息佇列中的訊息,可以被設定只消費一次、至少消費一次或者最多消費一次,
作者:李潘 出處:http://wing011203.cnblogs.com/ 本文著作權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利,轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/544681.html
標籤:Java
