Kafka 是基于發(fā)布與訂閱的消息系統(tǒng)。Kafka 是一個(gè)分布式的,可分區(qū)的,冗余備份的持久性的日志服務(wù)。它主要用于處理活躍的流式數(shù)據(jù)。
Kafka 的主要特點(diǎn)
- 1、同時(shí)為發(fā)布和訂閱提供高吞吐量。據(jù)了解,Kafka 每秒可以生產(chǎn)約 25 萬(wàn)消息(50MB),每秒處理 55 萬(wàn)消息(110MB)。
- 2、可進(jìn)行持久化操作。將消息持久化到磁盤,因此可用于批量消費(fèi),例如 ETL ,以及實(shí)時(shí)應(yīng)用程序。通過(guò)將數(shù)據(jù)持久化到硬盤,以及replication ,可以防止數(shù)據(jù)丟失。
- 3、分布式系統(tǒng),易于向外擴(kuò)展。所有的 Producer、Broker 和Consumer 都會(huì)有多個(gè),均為分布式的。并且,無(wú)需停機(jī)即可擴(kuò)展機(jī)器。
- 4、消息被處理的狀態(tài)是在 Consumer 端維護(hù),而不是由 Broker 端維護(hù)。當(dāng)失敗時(shí),能自動(dòng)平衡。
Kafka 的設(shè)計(jì)要點(diǎn)
1.吞吐量:
- 1、數(shù)據(jù)磁盤持久化:消息不在內(nèi)存中 Cache ,直接寫入到磁盤,充分利用磁盤的順序讀寫性能。
- 2、zero-copy:減少 IO 操作步驟
- 3、數(shù)據(jù)批量發(fā)送
- 4、數(shù)據(jù)壓縮
- 5、Topic 劃分為多個(gè) Partition ,提高并行度。
數(shù)據(jù)在磁盤上存取代價(jià)為 O(1):Kafka以 Topic 來(lái)進(jìn)行消息管理,每個(gè) Topic 包含多個(gè)Partition
,每個(gè) Partition 對(duì)應(yīng)一個(gè)邏輯 log ,有多個(gè) segment 文件組成。每個(gè) segment 中存儲(chǔ)多條消
息,消息 id 由其邏輯位置決定,即從消息 id 可直接定位到消息的存儲(chǔ)位置,避免 id 到位置的
額外映射。每個(gè) Partition 在內(nèi)存中對(duì)應(yīng)一個(gè) index ,記錄每個(gè) segment 中的第一條消息移。
發(fā)布者發(fā)到某個(gè) Topic 的消息會(huì)被均勻的分布到多個(gè) Partition 上(隨機(jī)或根據(jù)用戶指定的回調(diào)
函數(shù)進(jìn)行分布),Broker 收到發(fā)布消息往對(duì)應(yīng) Partition 的最后一個(gè) segment 上添加該消息。
當(dāng)某個(gè) segment上 的消息條數(shù)達(dá)到配置值或消息發(fā)布時(shí)間超過(guò)閾值時(shí),segment上 的消息會(huì)
被 flush 到磁盤,只有 flush 到磁盤上的消息訂閱者才能訂閱到,segment 達(dá)到一定的大小后
將不會(huì)再往該 segment 寫數(shù)據(jù),Broker 會(huì)創(chuàng)建新的 segment 文件。
2.負(fù)載均衡
- 1、Producer 根據(jù)用戶指定的算法,將消息發(fā)送到指定的 Partition 中。
- 2、Topic 存在多個(gè) Partition ,每個(gè) Partition 有自己的replica ,每個(gè) replica 分布在不同的 Broker 節(jié)點(diǎn)上。多個(gè)Partition 需要選取出 Leader partition ,Leader Partition 負(fù)責(zé)讀寫,并由 Zookeeper 負(fù)責(zé) fail over 。
- 3、相同 Topic 的多個(gè) Partition 會(huì)分配給不同的 Consumer 進(jìn)行拉取消息,進(jìn)行消費(fèi)。
3.拉取系統(tǒng)
由于 Kafka Broker 會(huì)持久化數(shù)據(jù),Broker 沒(méi)有內(nèi)存壓力,因此, Consumer 非常適合采取 pull 的方式消費(fèi)數(shù)據(jù),具有以下幾點(diǎn)好處:
- 1、簡(jiǎn)化 Kafka 設(shè)計(jì)。
- 2、Consumer 根據(jù)消費(fèi)能力自主控制消息拉取速度。
- 3、Consumer 根據(jù)自身情況自主選擇消費(fèi)模式,例如批量,重復(fù)消費(fèi),從尾端開始消費(fèi)等。
4.可擴(kuò)展性:通過(guò) Zookeeper 管理 Broker 與 Consumer 的動(dòng)態(tài)加入與離開。
- 1、當(dāng)需要增加 Broker 節(jié)點(diǎn)時(shí),新增的 Broker 會(huì)向 Zookeeper 注冊(cè),而 Producer 及 Consumer 會(huì)根據(jù)注冊(cè)在 Zookeeper 上的 watcher 感知這些變化,并及時(shí)作出調(diào)整。
- 2、當(dāng)新增和刪除 Consumer 節(jié)點(diǎn)時(shí),相同 Topic 的多個(gè) Partition 會(huì)分配給剩余的 Consumer 們。