消息中間件的兩種投遞模式及kafka的實現
消息中間件的兩種投遞模式:點對點和發布/訂閱
對于消息中間件,一般有兩種消息投遞模式:點對點(P2P,Point-to-Point)模式和發布/訂閱(Pub/Sub)模式
點對點是基于隊列的,消息生產者發送消息到隊列,消息消費者從隊列中接收消息。
發布/訂閱模式在消息的一對多廣播時采用。
這兩種模式時消息中間件領域最核心、最基礎的消息分發模型。
像kafka這樣的現代消息系統,其強大之處在于并非嚴格遵循其中某一種,而是通過靈活的消費者組(Consumer Group)機制,同時實現這兩種模式的核心語義。
一、點對點模式
- 核心特征:一條消息只能被一個消費者消費。消息一旦被消費就會從隊列中移除或被標記為已處理
- 類比:就像一個隊列(例如,銀行的一個排隊通道),下一個人(消費者)接手上一個人辦理完后的事務(消息),同一個事務不會被重復處理。
- 關鍵目標
- 負載均衡:多個消費者同時從一個隊列取消息,共同分擔處理壓力,提高系統吞吐量
- 消息不會被重復消費:確保任務或事務只被處理一次
- kafka如何實現P2P模式:Kafka通過“一個分區+單個消費者組”來實現
-
- 創建一個主題(Topic),并為它設置一定數量的分區(Partitions)
- 讓一個消費者組(Consumer Group)下的多個消費者實例(Consumer Instances)來訂閱這個主題
- Kafka會將主題的所有分區 分配給組內的各個消費者(一個分區在同一時間只能被組內一個消費者消費)
- 這樣,每條消息(由于位于某個特定分區)只會被發送到消費者組內的某一個消費者實例進行處理
效果:消息被均勻地分發給組內地多個消費者并行處理,實現了負載均衡,且每條消息只被消費一次。完美契合了P2P模式地需求。
二、發布/訂閱模式
- 核心特征:一條消息會被廣播給所有訂閱它的消費者
- 類比:一個新聞電臺,電臺(生產者)發布一條新聞(消息),所有正在收聽這個頻道(主題)的聽眾(消費者)都會同時收到這條新聞
- 關鍵目標:
- 廣播:將消息分發給多個獨立的消費者系統,這些系統可能對消息有不同的處理和用途(例如,一個訂單創建消息,需要同時通知庫存系統、積分系統、推薦系統)
- Kafka如何實現Pub/Sub模式?:Kafka通過“多個消費者組”來實現?
- 同一個主題(Topic)被多個獨立的消費者組(Consumer Group)訂閱
-
對于每個消費者組而言,kafka都會將其視為一個獨立的“訂閱者”
-
每個消費者組都會收到主題下全部的消息(每個組都會獨立地、完整地消費整個主題的數據流)
-
在每個消費者內部,消息的分配依然遵循P2P模式(即組內消費者負載均衡)
效果:一條消息從生產者發出后,會被 多個消費者組 同時接收并各自處理,這實現了消息的廣播,即 Pub/Sub模式。
三、總結
1、點對點模式:
- 目標:負載均衡,一條消息只被一個消費者處理
- Kafka實現方式:單個消費者組 消費一個主題,組內多個消費者實例共享主題的所有分區,每條消息只被組內的一個實例消費
- 圖示: 生產者 -> [主題] -> (消費者A,消費者B)屬于同一個組,消息在A、B間分配
2、發布/訂閱模式
- 目標:廣播,一條消息被所有訂閱者處理
- Kafka實現方式:多個消費者組同時訂閱一個主題,每個組都能收到全量消息,并在組內進行負載均衡。
- 圖示:生產者 -> [主題] -> Group 1: (消費者A1, B1)
-> Group 2: (消費者A2, B2)
提示:“發布/訂閱”中的“訂閱者”指的時整個消費者組,而不是組內單個消費者實例,單個消費者實例,單個消費者實例只是實現組內負載均衡的單元
Kafka本質上是一個高吞吐、持久化的發布/訂閱系統,同時通過消費者組的機制,優雅地集成并增強了點對點模式地功能。
浙公網安備 33010602011771號