緣由
因為工作學了rabbitMQ,所以閒暇之餘來學kafka,想知道兩者的差異
比較
速度 | 訊息保證 | 訊息大小 | 訊息量 | 消息留存 | 順序 | 重式機制 | 路由 | 消費者 | |
---|---|---|---|---|---|---|---|---|---|
rabbitMQ | 稍慢 | ACK 模式,確認拿走才刪 | 中 | 中 | 確認拿了,刪除不保留 | 不保證,失敗後會放回q,就亂了 | 內置重試邏輯和死信(dead-letter)交換器 | 可做篩選,再放入q | 智能代理和傻瓜式消費者模式push |
kafka | 有點慢 | 透過歷史紀錄重發送(消息日誌) | 大 | 大 | 刪除大於 主題超時時間紀錄,在之內可以一直消費 | 最適用於數據的流式處理 | 自己寫,失敗可能會阻塞,or丟到retry topic | 分區內所有都會接收,自己寫filter | 傻瓜式代理和智能消費者模式pull |
個人觀點
雖然兩邊本質都是發佈訂閱,但在技術實作上完全不相同,導致應用場景也不同,rabbitMQ適合短暫存放的訊息,訊息[推]給消費者後,就沒了,速度上也較快, 但kafka則是都寫到disk,用log的方式紀錄,消費者自己來[拉],所以同樣的訊息,可以做重新消費,也可以同時有不同的app根據目的,同時消費, rabbitMQ的訊息主要在broker這邊做控制,消費者單純的收,kafka則是在消費者這邊做控制,根據自己的需求,去拉取訊息,所以在設計上,kafka的彈性較大,但也較複雜
定義
分佈式流式平台,用於構建實時數據管道和流應用程序
架構
Topic
生產者依據分類,將訊息送到不同的topic,消費者依據需求,訂閱不同的topic
- 一個topic可以被0~n個消費者訂閱
- 一個topic可以被0~n個生產者發送
- 一個topic可以有1~n個partition,來存放msg
- 建立topic時,需要選舉,無法立刻發送訊息,因為沒有partition
Partition
屬於topic,訊息積累的地方,一個partition內都是有順序,但不同partition間,沒有順序
- 每個partition都有一個leader,多個follower,leader負責寫入,follower負責同步備份
- 訊息依照key值,分配到不同的partition(根據key的hash)
- 一個partition只被同一個group的一個consumer消費,但一個consumer可以消費多個partition
Consumer
消費者,自己去拉取下訊息
- 消費者可以屬於一個group
- 消費者可以消費多個partition
- 消費者可以自己控制offset,也可以讓kafka自己控制(GroupID)
Offset手動Vs自動
- 自動控制offset,kafka會記錄每個消費者消費到哪裡,採取批次commit,可能因連線發生重複消費
- 手動控制offset,消費者自己記錄offset,可以用同步或異步
Consumer Group
消費者群組,因為某個目的,需要多個consumer去消費,所以group的概念出現
Producer
生產者,將訊息送到topic
- 因partition有備份,所以在消息確認ack上,有三種
- 0: 射後不理
- 1: 等待leader的ack
- all: 等待leader與follower的ack
Broker
一個kafka server,真正放訊息的地方
Broker Cluster
多個kafka server組成集群,提供高可用性,當一個Broker掛掉,其他Broker可以接手
Broker Controller
負責管理broker,唯一,執行以下操作時,必須找Controller
- 創造、删除topic
- 集群Broker管理(新增,關閉,故障)
- 增加,重分配partitionpublic
這篇blog寫的很好,可以參考 https://jiamaoxiang.top/2020/07/06/Kafka%E7%9A%84Controller-Broker%E6%98%AF%E4%BB%80%E4%B9%88/
zookeeper
生產者,消費者,broker都要向他註冊
紀錄meta msg,broker的狀態,topic的狀態,consumer的狀態
Api種類
- Producer(生產者): 將訊息發送到topic
- Consumer(消費者): 從topic消費訊息
- Streams(流): 將topic的訊息處理後,再發送到topic
- Connect(連接器): 將topic的訊息處理後,再發送到外部系統
number of partitions and consumers
多餘的consumer會閒置 消費者可以同時消費多個partition 一個partition可以被多個consumer消費