Home
Posts
Categories
Series
Tags
About
Message Queue[三] Kafka
postedOn: 2024-11-23   updatedOn: 2024-11-23   includedIn: 程式
wordsCount: 1627   readingTime: 4 mins   viewers:

緣由

因為工作學了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

  1. 一個topic可以被0~n個消費者訂閱
  2. 一個topic可以被0~n個生產者發送
  3. 一個topic可以有1~n個partition,來存放msg
  4. 建立topic時,需要選舉,無法立刻發送訊息,因為沒有partition

Partition

屬於topic,訊息積累的地方,一個partition內都是有順序,但不同partition間,沒有順序

  1. 每個partition都有一個leader,多個follower,leader負責寫入,follower負責同步備份
  2. 訊息依照key值,分配到不同的partition(根據key的hash)
  3. 一個partition只被同一個group的一個consumer消費,但一個consumer可以消費多個partition

Consumer

消費者,自己去拉取下訊息

  1. 消費者可以屬於一個group
  2. 消費者可以消費多個partition
  3. 消費者可以自己控制offset,也可以讓kafka自己控制(GroupID)

Offset手動Vs自動

  1. 自動控制offset,kafka會記錄每個消費者消費到哪裡,採取批次commit,可能因連線發生重複消費
  2. 手動控制offset,消費者自己記錄offset,可以用同步或異步

Consumer Group

消費者群組,因為某個目的,需要多個consumer去消費,所以group的概念出現

Producer

生產者,將訊息送到topic

  1. 因partition有備份,所以在消息確認ack上,有三種
    1. 0: 射後不理
    2. 1: 等待leader的ack
    3. 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種類

  1. Producer(生產者): 將訊息發送到topic
  2. Consumer(消費者): 從topic消費訊息
  3. Streams(流): 將topic的訊息處理後,再發送到topic
  4. Connect(連接器): 將topic的訊息處理後,再發送到外部系統

number of partitions and consumers

多餘的consumer會閒置 消費者可以同時消費多個partition 一個partition可以被多個consumer消費