消息總線和消息隊(duì)列區(qū)別?
消息總線包含多個(gè)消息隊(duì)列,即接收到所有消息,內(nèi)部邏輯決定推送到哪個(gè)消息隊(duì)列。
消息隊(duì)列的發(fā)布訂閱原理?
訂閱的原理是不同系統(tǒng)之間的重合。Java消息服務(wù)(JMS)應(yīng)用程序接口是Java平臺(tái)上關(guān)于消息中間件(MOM)的API,用于在兩個(gè)應(yīng)用程序之間或分布式系統(tǒng)中發(fā)送消息以進(jìn)行異步通信。
對等訂閱和發(fā)布訂閱最初是由JMS定義的。兩種模式的主要區(qū)別或者說要解決的問題是,發(fā)送到隊(duì)列的消息是否可以重復(fù)消費(fèi)(多訂閱)。
1.定義
JMS規(guī)范目前支持兩種消息模型:點(diǎn)對點(diǎn)(隊(duì)列)和發(fā)布/訂閱(主題)。
1.1.點(diǎn)對點(diǎn):隊(duì)列,不能重復(fù)消費(fèi)。
消息生產(chǎn)者產(chǎn)生消息并將其發(fā)送到隊(duì)列,然后消息消費(fèi)者將消息從隊(duì)列中取出并使用它們。
消息被消費(fèi)后,隊(duì)列中沒有存儲(chǔ),所以消息消費(fèi)者不可能消費(fèi)已經(jīng)消費(fèi)的消息。隊(duì)列支持多個(gè)使用者的存在,但是只有一個(gè)使用者可以使用一條消息。
1.2.發(fā)布/訂閱:話題,可以反復(fù)消費(fèi)。
消息生產(chǎn)者(發(fā)布者)將消息發(fā)布到主題,同時(shí),多個(gè)消息消費(fèi)者(訂閱者)消費(fèi)該消息。與對等模式不同,發(fā)布到主題的消息將由所有訂閱者使用。
支持訂閱組的發(fā)布-訂閱模式:
在發(fā)布-訂閱模式下,當(dāng)發(fā)布者的消息量較大時(shí),單個(gè)訂閱者的處理能力明顯不足。實(shí)際上,在真實(shí)場景中,多個(gè)訂閱者節(jié)點(diǎn)組成一個(gè)訂閱群來負(fù)載均衡話題消息的消費(fèi),即群訂閱,這樣訂閱者就可以輕松實(shí)現(xiàn)消費(fèi)力的線性膨脹。可以看到,一個(gè)主題下有多個(gè)隊(duì)列,每個(gè)隊(duì)列都是點(diǎn)對點(diǎn)的,隊(duì)列都是發(fā)布訂閱的。
2.差異
2.1.點(diǎn)對點(diǎn)模式
生產(chǎn)者向隊(duì)列發(fā)送消息。一個(gè)隊(duì)列可以有許多消費(fèi)者,但是一條消息只能被一個(gè)消費(fèi)者接受。當(dāng)沒有可用的消費(fèi)者時(shí),消息將被保存直到有可用的消費(fèi)者,因此隊(duì)列實(shí)現(xiàn)了可靠的負(fù)載平衡。
2.2.發(fā)布-訂閱模式
發(fā)布者向主題發(fā)送的消息將僅由訂閱主題的訂閱者接收。話題實(shí)現(xiàn)發(fā)布和訂閱。當(dāng)您發(fā)布消息時(shí),訂閱該主題的所有服務(wù)都可以獲得該消息,因此1到n個(gè)訂閱者可以獲得該消息的副本。
3.熱門車型對比
傳統(tǒng)的企業(yè)消息隊(duì)列ActiveMQ遵循JMS規(guī)范,實(shí)現(xiàn)點(diǎn)對點(diǎn)。點(diǎn)和發(fā)布訂閱模型,但是其他流行的消息隊(duì)列RabbitMQ和Kafka不遵循JMS規(guī)范。
3.1、RabbitMQ
RabbitMQ實(shí)現(xiàn)了AQMP協(xié)議,該協(xié)議定義了消息路由的規(guī)則和方法。生產(chǎn)者通過路由規(guī)則將消息發(fā)送到不同的隊(duì)列,消費(fèi)者根據(jù)隊(duì)列名稱消費(fèi)消息。
RabbitMQ支持內(nèi)存隊(duì)列和持久隊(duì)列,消費(fèi)者是一個(gè)推模型。服務(wù)器負(fù)責(zé)維護(hù)消費(fèi)狀態(tài)和訂閱關(guān)系,消費(fèi)后立即刪除消息,不保留歷史消息。
(1)點(diǎn)對點(diǎn)
生產(chǎn)者通過路由向隊(duì)列發(fā)送消息,只有一個(gè)消費(fèi)者可以消費(fèi)它。
(2)更多訂閱
當(dāng)RabbitMQ需要支持多個(gè)訂閱時(shí),發(fā)布者發(fā)送的消息通過路由同時(shí)寫入多個(gè)隊(duì)列,不同的訂閱組消耗不同的隊(duì)列。因此,當(dāng)支持多個(gè)訂閱時(shí),消息將被復(fù)制多次。
3.2、卡夫卡
Kafka只支持消息持久化,消費(fèi)者是拉模型,客戶端負(fù)責(zé)維護(hù)消費(fèi)狀態(tài)和訂閱關(guān)系。消息消費(fèi)后,不會(huì)立即刪除,但會(huì)保留歷史消息。因此,當(dāng)支持多個(gè)訂閱時(shí),將只存儲(chǔ)一條消息。但是可能會(huì)有重復(fù)消費(fèi)。
(1)點(diǎn)對點(diǎn)amp多訂閱
發(fā)布者在主題中生成一條消息,不同的訂閱組使用這條消息。