1.點對點
訊息生產者訊息傳送到queue中,然後消費者從queue中取。 注意:訊息被消費以後,佇列中不再有儲存, 所以消費者不能 消費已經被消費的訊息了 。 也就是不能重複消費。
2.釋出/訂閱
生產者將訊息傳送到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 只支援訊息持久化,消費端為拉模型,消費狀態和訂閱關係由客戶端端負責維護,訊息消費完後不會立即刪除,會保留歷史訊息。因此支援多訂閱時,訊息只會儲存一份就可以了。
1.點對點
訊息生產者訊息傳送到queue中,然後消費者從queue中取。 注意:訊息被消費以後,佇列中不再有儲存, 所以消費者不能 消費已經被消費的訊息了 。 也就是不能重複消費。
2.釋出/訂閱
生產者將訊息傳送到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 只支援訊息持久化,消費端為拉模型,消費狀態和訂閱關係由客戶端端負責維護,訊息消費完後不會立即刪除,會保留歷史訊息。因此支援多訂閱時,訊息只會儲存一份就可以了。