Kafka 溫故(二):Kafka的基本概念和結構
一.Kafka中的核心概念
Producer: 特指訊息的生產者
Consumer :特指訊息的消費者
Consumer Group :消費者組,可以並行消費Topic中partition的訊息
Broker:快取代理,Kafa 叢集中的一臺或多臺伺服器統稱為 broker。
Topic:特指 Kafka 處理的訊息源(feeds of messages)的不同分類。
Partition:Topic 物理上的分組,一個 topic 可以分為多個 partition,每個 partition 是一個有序的佇列。partition 中的每條訊息都會被分配一個有序的 id(offset)
Message:訊息,是通訊的基本單位,每個 producer 可以向一個 topic(主題)釋出一些訊息
Producers(是個動詞):訊息和資料生產者,向 Kafka 的一個 topic 釋出訊息的過程叫做 producers
Consumers(是個動詞):訊息和資料消費者,訂閱 topics 並處理其釋出的訊息的過程叫做 consumers
二.Kafka的邏輯架構
注: 當一個Topic中訊息過多時,會對Topic進行分割槽處理,把訊息分到不同的Partition中。
為什麼要分割槽:
是為了對大量的資料進行分而治之,把資料分割槽,不同的Consumer可以消費不同分割槽的資料,不同Consumer對資料的消費可以做成並行的,這樣可以加快資料處理的速度。
訊息傳送的流程:
1.Producer根據指定的partition方法(round-robin、hash等),將訊息釋出到指定topic的partition裡面
2.kafka叢集接收到Producer發過來的訊息後,將其持久化到硬碟,並保留訊息指定時長(可配置),而不關注訊息是否被消費。
3.Consumer從kafka叢集pull資料,並控制獲取訊息的offset
三.Kafka的Producers
1.producers定義:
訊息和資料生產者,向 Kafka 的一個 topic 釋出訊息的過程叫做 produces
2.可指定訊息的partition:
Producer將訊息釋出到指定的Topic中,同時Producer也能決定將此訊息歸屬於哪個partition(即:生產者可以指定將傳送的訊息放在一個topic中的partition1,還是partition2中)(注:這種機制可以理解為一種變相的負載均衡,輪轉);比如基於"round-robin"方式或者通過其他的一些演算法等()
3.非同步傳送:
kafka支援非同步批量傳送訊息。批量傳送可以很有效的提高發送效率。Kafka producer的非同步傳送模式允許進行批量傳送,先將訊息快取在記憶體中,然後一次請求批量傳送出去
。
四.Kafka的broker
1.Broker:(可以把Broker理解為Kafka的伺服器)快取代理,Kafka 叢集中的一臺或多臺伺服器統稱為 broker。
注:
kafka中支援訊息持久化的,生產者生產訊息後,kafka不會直接把訊息傳遞給消費者,而是先要在broker中進行儲存,持久化是儲存在kafka的日誌檔案中。
2.Message在Broker中通Log追加(即新的訊息儲存在檔案的最後面,是有序的)的方式進行持久化儲存。並進行分割槽(patitions)
3.為了減少磁碟寫入的次數,broker會將訊息暫時buffer起來,當訊息的個數(或尺寸)達到一定閥值時,再flush到磁碟,這樣減少了磁碟IO呼叫的次數。
五.Kafka的broker無狀態機制
1. Broker沒有副本機制,一旦broker宕機,該broker的訊息將都不可用。
注:Broker沒有副本,那broker宕機了怎麼解決?
雖然broker沒有副本,但是訊息本身是有副本的,不會丟失。Broker只要在宕機後再讀取訊息的日誌就行了
2.Broker不儲存訂閱者的狀態,由訂閱者自己儲存。
3. 無狀態導致訊息的刪除成為難題(可能刪除的訊息正在被訂閱),kafka採用基於時間的SLA(服務水平保證),訊息儲存一定時間(通常為7天)後會被刪除。
4. 訊息訂閱者可以rewind back到任意位置重新進行消費,當訂閱者故障時,可以選擇最小的offset(id,即偏移量)進行重新讀取消費訊息。
注:1.消費者是如何確定,那條訊息應該消費,那條訊息已經消費了?
Zookeeper會幫助記錄那條訊息已經消費了,那條訊息沒有消費
2.消費者是如何快速的找到它沒有消費的訊息呢?
這個實現就要靠kafka中 “稀疏索引”
六.Kafka的Message的組成
1.Message訊息:
是通訊的基本單位,每個 producer 可以向一個 topic(主題)釋出一些訊息
2.Kafka中的Message是以topic為基本單位組織的,不同的topic之間是相互獨立的。每個topic又可以分成幾個不同的partition(每個topic有幾個partition是在建立topic時指定的),每個partition儲存一部分Message。
3.partition中的每條Message包含了以下三個屬性:
offset(偏移量,即訊息的唯一標示,通過它才能找到唯一的一條訊息)
對應型別:long
MessageSize 對應型別:int32
data 是message的具體內容
注:1.訊息是無狀態的,訊息的消費先後順序是沒有關係的
2.每一個partition只能由一個consumer來進行消費,但是一個consumer是可 以消費多個partition,是一對多的關係
七.Kafka的Partition的分割槽的目的
1.kafka基於檔案儲存.通過分割槽,可以將日誌內容分散到多個server上,來避免檔案尺寸達到單機磁碟的上限,每個partiton都會被當前server(kafka例項)儲存;
2.可以將一個topic切分多任意多個partitions,來訊息儲存/消費的效率.
3.越多的partitions意味著可以容納更多的consumer,有效提升併發消費的能力.
八.Kafka的Consumers
Ø訊息和資料消費者,訂閱 topics 並處理其釋出的訊息的過程叫做 consumers。
Ø在 kafka中,我們 可以認為一個group是一個“訂閱者”,一個Topic中的每個partions,只會被一個“訂閱者”中的一個consumer消費,不過一個 consumer可以消費多個partitions中的訊息(消費者資料小於Partions的數量時)
Ø
Ø注: kafka的設計原理決定,對於一個topic,同一個group中不能有多於partitions個數的consumer同時消費,否則將意味著某些consumer將無法得到訊息.