kafka

kafka

組件

broker

kafka集羣中包含一個或多個服務器,服務器節點爲broker

broker存儲topic的數據。如果某topic有N個partition,集羣有N個broker,那麼每個broker存儲該topic的一個partition。

如果某topic有N個partition,集羣有(N+M)個broker,那麼其中有N個broker存儲該topic的一個partition,剩下的M個broker不存儲該topic的partition數據。

如果某topic有N個partition,集羣中broker數目少於N個,那麼一個broker存儲該topic的一個或多個partition。在實際生產環境中,儘量避免這種情況的發生,這種情況容易導致Kafka集羣數據不均衡。

每條發佈到Kafka集羣的消息都有一個類別,這個類別被稱爲Topic。(物理上不同Topic的消息分開存儲,邏輯上一個Topic的消息雖然保存於一個或多個broker上但用戶只需指定消息的Topic即可生產或消費數據而不必關心數據存於何處)

類似於數據庫的表名

Partition

topic中的數據分割爲一個或多個partition。每個topic至少有一個partition。每個partition中的數據使用多個segment文件存儲。partition中的數據是有序的,不同partition間的數據丟失了數據的順序。如果topic有多個partition,消費數據時就不能保證數據的順序。在需要嚴格保證消息的消費順序的場景下,需要將partition數目設爲1。

producer

生產者即數據的發佈者,該角色將消息發佈到Kafka的topic中。broker接收到生產者發送的消息後,broker將該消息追加到當前用於追加數據的segment文件中。生產者發送的消息,存儲到一個partition中,生產者也可以指定數據存儲的partition。

consumer

消費者可以從broker中讀取數據。消費者可以消費多個topic中的數據。

consumer group

每個Consumer屬於一個特定的Consumer Group(可爲每個Consumer指定group name,若不指定group name則屬於默認的group)。

leader

每個partition有多個副本,其中有且僅有一個作爲Leader,Leader是當前負責數據的讀寫的partition。

follower

Follower跟隨Leader,所有寫請求都通過Leader路由,數據變更會廣播給所有Follower,Follower與Leader保持數據同步。如果Leader失效,則從Follower中選舉出一個新的Leader。當Follower與Leader掛掉、卡住或者同步太慢,leader會把這個follower從“in sync replicas”(ISR)列表中刪除,重新創建一個Follower。

總結

1,一條消息最終落入到某個主題的某個分區

2,客戶端

生產者

消費者

3,生產者

消息的區分選擇

a、null key:輪詢所有分區,負載均衡
b、key:hash(key)%分區數
c、指定分區:如果使用這種情況,那麼以上兩者無效
d、自定義分區:取決於如何實現

消息的成功發送

a、不等待集羣的反饋

-1

b、等待集羣的反饋:按照ack來確認消息是否發送成功

1

0:等待leader的反饋

all:等待所有副本的反饋

4、消費者

重複消費

a、重複消費:不同消費組
b、不重複消費:同一個消費組

不會在同一時刻,同一組內,多個消費者同時消費數據

一個分區的數據,只能交給一個消費者消費

一個消費者,可以消費多個分區中的數據,可以誇主題

負載均衡

a、儘可能的將多個分區,分配給不同的消費者消費

消費順序

a、保證一個分區中的數據消費過程是有序的

手段:

​ 將所有數據指定到某個分區中

​ 只設置一個分區

API

producerAPI

KafkaProducer<String, String> producer = new KafkaProducer<String, String>(properties);

comstomAPI

KafkaProducer<String,String> producer = new KafkaProducer<>(props)

分區API

接口org.apache.kafka.clients.producer.Partitioner

int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster)

攔截器API

接口org.apache.kafka.clients.producer.ProducerInterceptor

onSend()處理消息

onAcknowledgement()處理返回消息

kafkaStreamsAPI

接口org.apache.kafka.streams.processor.Processor<byte[],byte[]>

init(ProcessorContext context)

process(byte[] key,byte[] value)每條數據

context.forward

puctuate(long timestamp)週期性

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章