1、概念
Producer:
消息生產(chǎn)者欲芹,就是向kafka broker發(fā)消息的客戶端。
Consumer:
消費(fèi)消息。每個(gè)consumer屬于一個(gè)特定的consumer group(可為每個(gè)consumer指定group name徽缚,若不指定group name則屬于默認(rèn)的group)。同一topic的一條消息只能被同一個(gè)consumer group內(nèi)的一個(gè)consumer消費(fèi)革屠,但多個(gè)consumer group可同時(shí)消費(fèi)這一消息猎拨。Consumer Group中的每個(gè)Consumer讀取Topic的一個(gè)或多個(gè)Partitions,并且是唯一的Consumer屠阻;一個(gè)Consumer group的多個(gè)consumer的所有線程依次有序地消費(fèi)一個(gè)topic的所有partitions,如果Consumer group中所有consumer總線程大于partitions數(shù)量红省,則會(huì)出現(xiàn)空閑情況。這樣可以做到負(fù)載均衡国觉,也可以實(shí)現(xiàn)順序消費(fèi)(group中只有一個(gè)consumer)吧恃。
Broker:
一臺(tái)kafka服務(wù)器就是一個(gè)broker。一個(gè)集群由多個(gè)broker組成麻诀。一個(gè)broker可以容納多個(gè)topic痕寓。
topic:
可以理解為一個(gè)MQ消息隊(duì)列的名字。每條發(fā)布到Kafka集群的消息都有一個(gè)類別蝇闭,這個(gè)類別被稱為topic呻率。(物理上不同topic的消息分開存儲(chǔ),邏輯上一個(gè)topic的消息雖然保存于一個(gè)或多個(gè)broker上但用戶只需指定消息的topic即可生產(chǎn)或消費(fèi)數(shù)據(jù)而不必關(guān)心數(shù)據(jù)存于何處)呻引。
Partition:
parition是物理上的概念礼仗,每個(gè)topic包含一個(gè)或多個(gè)partition,創(chuàng)建topic時(shí)可指定parition數(shù)量。每個(gè)partition對(duì)應(yīng)于一個(gè)文件夾元践,該文件夾下存儲(chǔ)該partition的數(shù)據(jù)和索引文件韭脊。為了實(shí)現(xiàn)擴(kuò)展性,一個(gè)非常大的topic可以分布到多個(gè) broker(即服務(wù)器)上单旁,一個(gè)topic可以分為多個(gè)partition沪羔,每個(gè)partition是一個(gè)有序的隊(duì)列。partition中的每條消息 都會(huì)被分配一個(gè)有序的id(offset)象浑。kafka只保證按一個(gè)partition中的順序?qū)⑾l(fā)給consumer蔫饰,不保證一個(gè)topic的整體 (多個(gè)partition間)的順序。也就是說(shuō)愉豺,一個(gè)topic在集群中可以有多個(gè)partition死嗦,那么分區(qū)的策略是什么?(消息發(fā)送到哪個(gè)分區(qū)上粒氧,有兩種基本的策略越除,一是采用Key Hash算法,一是采用Round Robin算法)
Offset:
kafka的存儲(chǔ)文件都是按照offset.kafka來(lái)命名外盯,用offset做名字的好處是方便查找摘盆。例如你想找位于2049的位置,只要找到2048.kafka的文件即可饱苟。當(dāng)然the first offset就是00000000000.kafka
2孩擂、架構(gòu)
leader-followers結(jié)構(gòu)
每個(gè)分區(qū)都由一個(gè)服務(wù)器作為“l(fā)eader”,零或若干服務(wù)器作為“followers”,leader負(fù)責(zé)處理消息的讀和寫箱熬,followers則去復(fù)制leader.如果leader down了类垦,followers中的一臺(tái)則會(huì)自動(dòng)成為leader。集群中的每個(gè)服務(wù)都會(huì)同時(shí)扮演兩個(gè)角色:作為它所持有的一部分分區(qū)的leader城须,同時(shí)作為其他分區(qū)的followers蚤认,這樣集群就會(huì)據(jù)有較好的負(fù)載均衡。同時(shí)糕伐,副本也保證了kafka的容錯(cuò)能力砰琢。
Zookeeper負(fù)責(zé)選擇leader和保存kafka的元數(shù)據(jù)(服務(wù)器和topic名稱等信息)
3、Kafka消息處理
Producer根據(jù)指定的partition方法(round-robin良瞧、hash等)陪汽,將消息發(fā)布到指定topic的partition里面。
kafka集群接收到Producer發(fā)過(guò)來(lái)的消息后褥蚯,將其持久化到硬盤挚冤,并保留消息指定時(shí)長(zhǎng)(可配置),而不關(guān)注消息是否被消費(fèi)赞庶。
Consumer從kafka集群pull數(shù)據(jù)训挡,并控制獲取消息的offset澳骤。
Kafka需要維持的元數(shù)據(jù)只有一個(gè)–消費(fèi)消息在Partition中的offset值,Consumer每消費(fèi)一個(gè)消息舍哄,offset就會(huì)加1宴凉。其實(shí)消息的狀態(tài)完全是由Consumer控制的誊锭,Consumer可以跟蹤和重設(shè)這個(gè)offset值表悬,這樣的話Consumer就可以讀取任意位置的消息。
4丧靡、Zookeeper中存儲(chǔ)的Kafka節(jié)點(diǎn)結(jié)構(gòu)