MQ消息隊列基礎2(兩種模式)

1.消息隊列常用的兩種模型:點對點和發佈/訂閱

點對點:消息生產者生產消息發送到queue中,然後消息消費者從queue中取出並且消費消息。

1.1

同一個隊列可以關聯多個消息生產者和消息消費者,但一條消息只能夠被一個消息消費者接收;如果多個消息消費者正在監聽隊列上的消息,JMS消息服務器將根據“先來者優先”的原則確定由哪個消息消費者接收下一條消息,消息消費者接收到消息不重複——比如一個消息發佈者發佈了10個消息,兩個接收者A和B,那麼A和B兩個接收者總共會收到10條消息,不重複——也就是說一個Queue可以有很多消息消費者,並且在多個可用的消息消費者中負載均衡;

1.2

消息生產者不需要在消息接收者接收該消息期間處於運行狀態,消息接收者也不需要在發送消息時處於運行狀態;

1.3

消息接收者接收的所有消息都需要簽收,以通知消息服務器是否已接受。如果消息服務器獲知某條消息已經被消息消費者接收,那麼該消息將從消息服務器端特定的隊列中移走;否則該條消息將保留在消息服務器端特定的隊列中,一直到消息服務器獲知該條消息已被消息消費者接受爲止(即如果在消息生成者發送消息的時沒有消息消費者接收該條消息,那麼該消息將保留在消息服務器端特定的隊列中,一直到有消息消費者接收該條消息)
 

1.4

這種消息傳遞模型是傳統意義上的懶模型或輪詢模型。在此模型中,消息不是自動推動給消息消費者的,而是要由消息消費者從隊列中請求獲得。

2.發佈/訂閱,可以重複消費

2.1

消息生產者將消息發佈到topic中,可以同時有多個消費者進行訂閱消費同一條消息。

2.2

只有訂閱了topic裏主題的且處於活躍狀態的訂閱者纔會接受到消息(除非訂閱者建立了持久的訂閱。訂閱者建立持久訂閱後,消息發佈者在消息訂閱者處於非活動狀態時發佈的消息將在消息訂閱者再次處於活動狀態時重新發布以使再度處於活動狀態的消息訂閱者接收到該消息)

2.3

消息訂閱者接收的所有消息都需要簽收,以通知消息服務器是否已接受(即JMS一直保留消息,直至某個特定主題對應的所有訂閱者都接收到消息爲止)。

2.4

pub/sub消息傳遞模型基本上是一個推模型。在該模型中,消息服務器會自動將特定主題中的消息廣播出去,消息消費者無須通過主動請求或輪詢主題的方法來獲得新的消息。

3 流行模型比較

傳統企業型消息隊列ActiveMQ遵循了JMS規範,實現了點對點和發佈訂閱模型,但其他流行的消息隊列RabbitMQ、Kafka並沒有遵循JMS規範。

3.1

RabbitMQ實現了AQMP協議,AQMP協議定義了消息路由規則和方式。生產端通過路由規則發送消息到不同queue,消費端根據queue名稱消費消息。
RabbitMQ既支持內存隊列也支持持久化隊列,消費端爲推模型,消費狀態和訂閱關係由服務端負責維護,消息消費完後立即刪除,不保留歷史消息。

(1)點對點
生產端發送一條消息通過路由投遞到Queue,只有一個消費者能消費到。

3.2多訂閱
當RabbitMQ需要支持多訂閱時,發佈者發送的消息通過路由同時寫到多個Queue,不同訂閱組消費不同的Queue。所以支持多訂閱時,消息會多個拷貝。

 

4.Kafka

Kafka只支持消息持久化,消費端爲拉模型,消費狀態和訂閱關係由客戶端端負責維護,消息消費完後不會立即刪除,會保留歷史消息。因此支持多訂閱時,消息只會存儲一份就可以了。但是可能產生重複消費的情況。

(1)點對點&多訂閱
發佈者生產一條消息到topic中,不同訂閱組消費此消息。

 

較好的參考資料:

https://blog.csdn.net/cws1214/article/details/52922267

https://www.cnblogs.com/jackytang/p/9011051.html

https://blog.csdn.net/chushoufengli/article/details/102806299

 

發佈了7 篇原創文章 · 獲贊 0 · 訪問量 4808
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章