1. 程式人生 > >消息隊列中點對點與發布訂閱區別

消息隊列中點對點與發布訂閱區別

分析 平臺 分布式系統 保存 sdn s/4 分布式系 1.0 應用程序

背景知識

JMS一個在 Java標準化組織(JCP)內開發的標準(代號JSR 914)。2001年6月25日,Java消息服務發布JMS 1.0.2b,2002年3月18日Java消息服務發布 1.1.
Java消息服務(Java Message Service,JMS)應用程序接口是一個Java平臺中關於面向消息中間件(MOM)的API,用於在兩個應用程序之間,或分布式系統中發送消息,進行異步通信。
點對點與發布訂閱最初是由JMS定義的。這兩種模式主要區別或解決的問題就是發送到隊列的消息能否重復消費(多訂閱)

1.JMS中定義

JMS規範目前支持兩種消息模型:點對點(point to point, queue)和發布/訂閱(publish/subscribe,topic)。
點對點:
消息生產者生產消息發送到queue中,然後消息消費者從queue中取出並且消費消息。這裏要註意:
消息被消費以後,queue中不再有存儲,所以消息消費者不可能消費到已經被消費的消息。
Queue支持存在多個消費者,但是對一個消息而言,只會有一個消費者可以消費。
發布/訂閱
消息生產者(發布)將消息發布到topic中,同時有多個消息消費者(訂閱)消費該消息。和點對點方式不同,發布到topic的消息會被所有訂閱者消費。

2.二者分析與區別

2.1 點對點模式

技術分享圖片
生產者發送一條消息到queue,只有一個消費者能收到。

2.2 發布訂閱模式

技術分享圖片
發布者發送到topic的消息,只有訂閱了topic的訂閱者才會收到消息。

小結

queue實現了負載均衡,一個消息只能被一個消費者接受,當沒有消費者可用時,這個消息會被保存直到有 一個可用的消費者,一個queue可以有很多消費者,他們之間實現了負載均衡,
所以Queue實現了一個可靠的負載均衡。
topic實現了發布和訂閱,當你發布一個消息,所有訂閱這個topic的服務都能得到這個消息,所以從1到N個訂閱者都能得到一個消息的拷貝,
只有在消息代理收到消息時有一個有效訂閱時的訂閱者才能得到這個消息的拷貝。

疑問

發布訂閱模式下,能否實現訂閱者負載均衡消費呢?當發布者消息量很大時,顯然單個訂閱者的處理能力是不足的。實際上現實場景中是多個訂閱者節點組成一個訂閱組負載均衡消費topic消息即分組訂閱,
這樣訂閱者很容易實現消費能力線性擴展。
技術分享圖片

3 流行消息隊列的消息模型比較

傳統企業型消息隊列ActiveMQ遵循了JMS規範,實現了點對點和發布訂閱模型,但其他流行的消息隊列RabbitMQ、Kafka並沒有遵循老態龍鐘的JMS規範,是通過什麽方式實現消費負載均衡、多訂閱呢?

3.1 RabbitMQ

RabbitMQ實現了AQMP協議,AQMP協議定義了消息路由規則和方式。生產端通過路由規則發送消息到不同queue,消費端根據queue名稱消費消息。此外RabbitMQ是向消費端推送消息,訂閱關系和消費狀態保存在服務端。
技術分享圖片


生產端發送一條消息通過路由投遞到Queue,只有一個消費者能消費到。
技術分享圖片
當RabbitMQ需要支持多訂閱時,發布者發送的消息通過路由同時寫到多個Queue,不同訂閱組消費此消息。
RabbitMQ既支持內存隊列也支持持久化隊列,消費端為推模型,消費狀態和訂閱關系由服務端負責維護,消息消費完後立即刪除,不保留歷史消息。所以支持多訂閱時,消息會多個拷貝。

3.2 Kafka

技術分享圖片
Kafka只支持消息持久化,消費端為拉模型,消費狀態和訂閱關系由客戶端端負責維護,消息消費完後不會立即刪除,會保留歷史消息。因此支持多訂閱時,消息只會存儲一份就可以了。

轉載:https://blog.csdn.net/lizhitao/article/details/47723105

消息隊列中點對點與發布訂閱區別