1.JMS定義
JMS規(guī)范支持兩種消息模型:點對點(point to point绵疲, queue)和發(fā)布/訂閱(publish/subscribe,topic)狼犯。
1. 點對點
生產(chǎn)者生產(chǎn)消息發(fā)送到queue中汰聋,然后消費者從queue中取出并且消費消息俗冻。這里要注意:
消息被消費以后,queue中不再有存儲,所以消費者不可能消費到已經(jīng)被消費的消息。
Queue支持存在多個消費者溜徙,但是對一個消息而言,只會有一個消費者可以消費犀填。
2. 發(fā)布/訂閱
生產(chǎn)者將消息發(fā)布到topic中蠢壹,同時有多個消費者訂閱該消息。和點對點方式不同九巡,發(fā)布到topic的消息會被所有訂閱者消費图贸。
2. 二者分析與區(qū)別
2.1 點對點模式
2.2 發(fā)布訂閱模式
小結(jié)
queue實現(xiàn)了負載均衡疏日,一條消息只能被一個消費者接收,當沒有消費者可用時撒汉,這個消息會被保存直到有一個可用的消費者沟优,一個queue可以有很多消費者,他們之間實現(xiàn)了負載均衡睬辐, 所以Queue實現(xiàn)了一個可靠的負載均衡净神。 topic實現(xiàn)了發(fā)布和訂閱,當你發(fā)布一個消息溉委,所有訂閱這個topic的服務(wù)都能得到這個消息,所以從1到N個訂閱者都能得到一個消息的拷貝
疑問
發(fā)布訂閱模式下爱榕,能否實現(xiàn)訂閱者負載均衡消費呢瓣喊?當發(fā)布者消息量很大時,顯然單個訂閱者的處理能力是不足的黔酥。實際上現(xiàn)實場景中是多個訂閱者節(jié)點組成一個訂閱組負載均衡消費topic消息即分組訂閱藻三,
這樣訂閱者很容易實現(xiàn)消費能力線性擴展。
3. 流行消息隊列的消息模型比較
傳統(tǒng)企業(yè)型消息隊列ActiveMQ遵循了JMS規(guī)范跪者,實現(xiàn)了點對點和發(fā)布訂閱模型棵帽,但其他流行的消息隊列RabbitMQ、Kafka并沒有遵循老態(tài)龍鐘的JMS規(guī)范渣玲,是通過什么方式實現(xiàn)消費負載均衡逗概、多訂閱呢?
3.1 RabbitMQ
RabbitMQ實現(xiàn)了AQMP協(xié)議忘衍,AQMP協(xié)議定義了消息路由規(guī)則和方式逾苫。生產(chǎn)端通過路由規(guī)則發(fā)送消息到不同queue卿城,消費端根據(jù)queue名稱消費消息。此外RabbitMQ是向消費端推送消息铅搓,訂閱關(guān)系和消費狀態(tài)保存在服務(wù)端瑟押。
生產(chǎn)端發(fā)送一條消息通過路由投遞到Queue,只有一個消費者能消費到星掰。
當RabbitMQ需要支持多訂閱時多望,發(fā)布者發(fā)送的消息通過路由同時寫到多個Queue,不同訂閱組消費此消息氢烘。
RabbitMQ既支持內(nèi)存隊列也支持持久化隊列怀偷,消費端為推模型,消費狀態(tài)和訂閱關(guān)系由服務(wù)端負責維護威始,消息消費完后立即刪除枢纠,不保留歷史消息。所以支持多訂閱時黎棠,消息會多個拷貝晋渺。
3.2 Kafka
Kafka只支持消息持久化,消費端為拉模型脓斩,消費狀態(tài)和訂閱關(guān)系由客戶端端負責維護木西,消息消費完后不會立即刪除,會保留歷史消息随静。因此支持多訂閱時八千,消息只會存儲一份就可以了。
同一個訂閱組會消費topic所有消息燎猛,每條消息只會被同一個訂閱組的一個消費節(jié)點消費恋捆,同一個訂閱組內(nèi)不同消費節(jié)點會消費不同消息
轉(zhuǎn)自:https://blog.csdn.net/lizhitao/article/details/47723105