Kafka基础知识入门
Kafka解析
www.jasongj.com/2015/01/02/Kafka深度解析
Terminology:
Kafka集群包含一個(gè)或多個(gè)服務(wù)器,這種服務(wù)器被稱為broker
每條發(fā)布到Kafka集群的消息都有一個(gè)類別,這個(gè)類別被稱為topic。(物理上不同topic的消息分開存儲(chǔ),邏輯上一個(gè)topic的消息雖然保存于一個(gè)或多個(gè)broker上但用戶只需指定消息的topic即可生產(chǎn)或消費(fèi)數(shù)據(jù)而不必關(guān)心數(shù)據(jù)存于何處)
parition是物理上的概念,每個(gè)topic包含一個(gè)或多個(gè)partition,創(chuàng)建topic時(shí)可指定parition數(shù)量。每個(gè)partition對(duì)應(yīng)于一個(gè)文件夾,該文件夾下存儲(chǔ)該partition的數(shù)據(jù)和索引文件
負(fù)責(zé)發(fā)布消息到Kafka broker
消費(fèi)消息。每個(gè)consumer屬于一個(gè)特定的consumer group(可為每個(gè)consumer指定group name,若不指定group name則屬于默認(rèn)的group)。使用consumer high level API時(shí),同一topic的一條消息只能被同一個(gè)consumer group內(nèi)的一個(gè)consumer消費(fèi),但多個(gè)consumer group可同時(shí)消費(fèi)這一消息。
架構(gòu):?
一個(gè)典型的kafka集群中包含若干producer(可以是web前端產(chǎn)生的page view,或者是服務(wù)器日志,系統(tǒng)CPU、memory等),若干broker(Kafka支持水平擴(kuò)展,一般broker數(shù)量越多,集群吞吐率越高),若干consumer group,以及一個(gè)Zookeeper集群。Kafka通過(guò)Zookeeper管理集群配置,選舉leader,以及在consumer group發(fā)生變化時(shí)進(jìn)行rebalance。producer使用push模式將消息發(fā)布到broker,consumer使用pull模式從broker訂閱并消費(fèi)消息。
Consumer Group?
High Level Consumer將從某個(gè)Partition讀取的最后一條消息的offset存于ZooKeeper中( Kafka從0.8.2版本開始同時(shí)支持將offset存于Zookeeper中與將offset存于專用的Kafka Topic中 )。 這個(gè)offset基于客戶程序提供給Kafka的名字來(lái)保存,這個(gè)名字被稱為Consumer Group。 Consumer Group是整個(gè)Kafka集群全局的,而非某個(gè)Topic的。 每一個(gè)High Level Consumer實(shí)例都屬于一個(gè)Consumer Group,若不指定則屬于默認(rèn)的Group。
Push vs. Pull
作為一個(gè)messaging system,Kafka遵循了傳統(tǒng)的方式,選擇由producer向broker push消息并由consumer從broker pull消息。一些logging-centric system,比如Facebook的Scribe和Cloudera的Flume,采用非常不同的push模式。事實(shí)上,push模式和pull模式各有優(yōu)劣。?
push模式很難適應(yīng)消費(fèi)速率不同的消費(fèi)者,因?yàn)橄l(fā)送速率是由broker決定的。push模式的目標(biāo)是盡可能以最快速度傳遞消息,但是這樣很容易造成consumer來(lái)不及處理消息,典型的表現(xiàn)就是拒絕服務(wù)以及網(wǎng)絡(luò)擁塞。而pull模式則可以根據(jù)consumer的消費(fèi)能力以適當(dāng)?shù)乃俾氏M(fèi)消息。
Topic & Partition
Topic在邏輯上可以被認(rèn)為是一個(gè)queue。每條消費(fèi)都必須指定它的topic,可以簡(jiǎn)單理解為必須指明把這條消息放進(jìn)哪個(gè)queue里。為了使得Kafka的吞吐率可以水平擴(kuò)展,物理上把topic分成一個(gè)或多個(gè)partition,每個(gè)partition在物理上對(duì)應(yīng)一個(gè)文件夾,該文件夾下存儲(chǔ)這個(gè)partition的所有消息和索引文件。
Kafka保證同一Consumer Group中只有一個(gè)Consumer會(huì)消費(fèi)某條消息,實(shí)際上,Kafka保證的是穩(wěn)定狀態(tài)下每一個(gè)Consumer實(shí)例只會(huì)消費(fèi)某一個(gè)或多個(gè)特定Partition的數(shù)據(jù),而某個(gè)Partition的數(shù)據(jù)只會(huì)被某一個(gè)特定的Consumer實(shí)例所消費(fèi)。 也就是說(shuō)Kafka對(duì)消息的分配是以Partition為單位分配的,而非以每一條消息作為分配單元。 這樣設(shè)計(jì)的劣勢(shì)是無(wú)法保證同一個(gè)Consumer Group里的Consumer均勻消費(fèi)數(shù)據(jù),優(yōu)勢(shì)是每個(gè)Consumer不用都跟大量的Broker通信,減少通信開銷,同時(shí)也降低了分配難度,實(shí)現(xiàn)也更簡(jiǎn)單。 另外,因?yàn)橥粋€(gè)Partition里的數(shù)據(jù)是有序的,這種設(shè)計(jì)可以保證每個(gè)Partition里的數(shù)據(jù)可以被有序消費(fèi)。?
總結(jié)下來(lái)就是:每一個(gè)Consumer實(shí)例只會(huì)消費(fèi)某一個(gè)或多個(gè)特定Partition的數(shù)據(jù),而某個(gè)Partition的數(shù)據(jù)只會(huì)被某一個(gè)特定的Consumer實(shí)例所消費(fèi)。
如果某Consumer Group中Consumer(每個(gè)Consumer只創(chuàng)建1個(gè)MessageStream)數(shù)量少于Partition數(shù)量,則至少有一個(gè)Consumer會(huì)消費(fèi)多個(gè)Partition的數(shù)據(jù),如果Consumer的數(shù)量與Partition數(shù)量相同,則正好一個(gè)Consumer消費(fèi)一個(gè)Partition的數(shù)據(jù)。 而如果Consumer的數(shù)量多于Partition的數(shù)量時(shí),會(huì)有部分Consumer無(wú)法消費(fèi)該Topic下任何一條消息。
Consumer Rebalance的算法如下:
將目標(biāo)Topic下的所有Partirtion排序,存于PT?
對(duì)某Consumer Group下所有Consumer排序,存于CG,第i個(gè)Consumer記為Ci?
N=size(PT)/size(CG),向上取整?
解除Ci對(duì)原來(lái)分配的Partition的消費(fèi)權(quán)(i從0開始)?
將第i?N到(i+1)?N?1個(gè)Partition分配給Ci?
目前,最新版(0.8.2.1)Kafka的Consumer Rebalance的控制策略是由每一個(gè)Consumer通過(guò)在Zookeeper上注冊(cè)Watch完成的。 每個(gè)Consumer被創(chuàng)建時(shí)會(huì)觸發(fā)Consumer Group的Rebalance,具體啟動(dòng)流程如下:
High Level Consumer啟動(dòng)時(shí)將其ID注冊(cè)到其Consumer Group下,在Zookeeper上的路徑為/consumers/[consumer group]/ids/[consumer id]?
在/consumers/[consumer group]/ids上注冊(cè)Watch?
在/brokers/ids上注冊(cè)Watch?
如果Consumer通過(guò)Topic Filter創(chuàng)建消息流,則它會(huì)同時(shí)在/brokers/topics上也創(chuàng)建Watch?
強(qiáng)制自己在其Consumer Group內(nèi)啟動(dòng)Rebalance流程?
在這種策略下,每一個(gè)Consumer或者Broker的增加或者減少都會(huì)觸發(fā)Consumer Rebalance。 因?yàn)槊總€(gè)Consumer只負(fù)責(zé)調(diào)整自己所消費(fèi)的Partition,為了保證整個(gè)Consumer Group的一致性,當(dāng)一個(gè)Consumer觸發(fā)了Rebalance時(shí),該Consumer Group內(nèi)的其它所有其它Consumer也應(yīng)該同時(shí)觸發(fā)Rebalance。
如果想更深入的了解 ?請(qǐng)查看http://www.infoq.com/cn/profile/%E9%83%AD%E4%BF%8A
總結(jié)
以上是生活随笔為你收集整理的Kafka基础知识入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 区块链基础知识系列第5课 Hyperle
- 下一篇: Go语言重点知识点1