消息隊列的兩種模式

Java消息服務(Java Message Service,JMS)應用程序接口是一個Java平臺中關於面向消息中間件(MOM)的API,用於在兩個應用程序之間,或分佈式系統中發送消息,進行異步通訊。
點對點與發佈訂閱最初是由JMS定義的。這兩種模式主要區別或解決的問題就是發送到隊列的消息可否重複消費(多訂閱)html

一、定義

JMS規範目前支持兩種消息模型:點對點(point to point, queue)和發佈/訂閱(publish/subscribe,topic)。負載均衡

1.一、點對點:Queue,不可重複消費

消息生產者生產消息發送到queue中,而後消息消費者從queue中取出而且消費消息。
消息被消費之後,queue中再也不有存儲,因此消息消費者不可能消費到已經被消費的消息。Queue支持存在多個消費者,可是對一個消息而言,只會有一個消費者能夠消費。異步

1.二、發佈/訂閱:Topic,能夠重複消費

消息生產者(發佈)將消息發佈到topic中,同時有多個消息消費者(訂閱)消費該消息。和點對點方式不一樣,發佈到topic的消息會被全部訂閱者消費。

支持訂閱組的發佈訂閱模式:
發佈訂閱模式下,當發佈者消息量很大時,顯然單個訂閱者的處理能力是不足的。實際上現實場景中是多個訂閱者節點組成一個訂閱組負載均衡消費topic消息即分組訂閱,這樣訂閱者很容易實現消費能力線性擴展。能夠當作是一個topic下有多個Queue,每一個Queue是點對點的方式,Queue之間是發佈訂閱方式。
分佈式

二、區別

2.一、點對點模式

生產者發送一條消息到queue,一個queue能夠有不少消費者,可是一個消息只能被一個消費者接受,當沒有消費者可用時,這個消息會被保存直到有 一個可用的消費者,因此Queue實現了一個可靠的負載均衡。post

2.二、發佈訂閱模式

發佈者發送到topic的消息,只有訂閱了topic的訂閱者纔會收到消息。topic實現了發佈和訂閱,當你發佈一個消息,全部訂閱這個topic的服務都能獲得這個消息,因此從1到N個訂閱者都能獲得這個消息的拷貝。

3d

三、流行模型比較

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

3.一、RabbitMQ

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

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


(2)多訂閱
當RabbitMQ須要支持多訂閱時,發佈者發送的消息經過路由同時寫到多個Queue,不一樣訂閱組消費不一樣的Queue。因此支持多訂閱時,消息會多個拷貝。blog

3.二、Kafka

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

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


接口

相關文章
相關標籤/搜索