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