Kafka是當(dāng)前分布式系統(tǒng)中最流行的消息中間件之一蚊丐,憑借著其高吞吐量的設(shè)計(jì)想帅,在日志收集系統(tǒng)和消息系統(tǒng)的應(yīng)用場(chǎng)景中深得開(kāi)發(fā)者喜愛(ài)输玷。
本篇就聊聊Kafka相關(guān)的一些知識(shí)點(diǎn)。主要包括以下內(nèi)容:
- Kafka簡(jiǎn)介
- Kafka特點(diǎn)
- Kafka基本概念
- Kafka架構(gòu)
- Kafka的幾個(gè)核心概念
- 分區(qū)Partition
- 復(fù)制Replication
- 消息發(fā)送
- 消費(fèi)者組
- 消費(fèi)偏移量
- Kafka的工程應(yīng)用
Kafka簡(jiǎn)介
Kafka特點(diǎn)
Kafka是最初由Linkedin公司開(kāi)發(fā)玩祟,是一個(gè)分布式腹缩、分區(qū)的、多副本的、多訂閱者藏鹊,基于zookeeper協(xié)調(diào)的分布式日志系統(tǒng)(也可以當(dāng)做MQ系統(tǒng))润讥,常見(jiàn)可以用于web/nginx日志、訪問(wèn)日志盘寡,消息服務(wù)等等楚殿,Linkedin于2010年貢獻(xiàn)給了Apache基金會(huì)并成為頂級(jí)開(kāi)源項(xiàng)目。
相比于其他的消息隊(duì)列中間件宴抚,Kafka的主要設(shè)計(jì)目標(biāo)勒魔,也即其特點(diǎn)如下:
- 以時(shí)間復(fù)雜度為O(1)的方式提供消息持久化能力甫煞,即使對(duì)TB級(jí)以上數(shù)據(jù)也能保證常數(shù)時(shí)間的訪問(wèn)性能菇曲。
- 高吞吐率。即使在非常廉價(jià)的商用機(jī)器上也能做到單機(jī)支持每秒100K條消息的傳輸抚吠。
- 支持Kafka Server間的消息分區(qū)常潮,及分布式消費(fèi),同時(shí)保證每個(gè)partition內(nèi)的消息順序傳輸楷力。
- 同時(shí)支持離線數(shù)據(jù)處理和實(shí)時(shí)數(shù)據(jù)處理喊式。
- Scale out:支持在線水平擴(kuò)展
Kafka基本概念
Broker
- Kaka集群中的一臺(tái)或多臺(tái)服務(wù)器稱為Broker。Broker存儲(chǔ)Topic的數(shù)據(jù)萧朝。
- 如果某topic有N個(gè)partition岔留,集群有N個(gè)broker,那么每個(gè)broker存儲(chǔ)該topic的一個(gè)partition检柬。
- 如果某topic有N個(gè)partition献联,集群有(N+M)個(gè)broker,那么其中有N個(gè)broker存儲(chǔ)該topic的一個(gè)partition何址,剩下的M個(gè)broker不存儲(chǔ)該topic的partition數(shù)據(jù)里逆。
- 如果某topic有N個(gè)partition,集群中broker數(shù)目少于N個(gè)用爪,那么一個(gè)broker存儲(chǔ)該topic的一個(gè)或多個(gè)partition原押。在實(shí)際生產(chǎn)環(huán)境中,盡量避免這種情況的發(fā)生偎血,這種情況容易導(dǎo)致Kafka集群數(shù)據(jù)不均衡诸衔。
Topic - 發(fā)布到Kafka的每條消息都有一個(gè)類別,是個(gè)邏輯概念颇玷。
- 物理上不同Topic的消息分開(kāi)存儲(chǔ)笨农,邏輯上一個(gè)Topic的消息雖然保存于一個(gè)或多個(gè)broker上,但用戶只需指定消息的Topic即可生產(chǎn)或消費(fèi)數(shù)據(jù)而不必關(guān)心數(shù)據(jù)存于何處
Partition - 物理上的Topic分區(qū)亚隙,一個(gè)Topic可以分為多個(gè)Partition磁餐,至少有一個(gè)Partition。
- 每個(gè)Partition中的數(shù)據(jù)使用多個(gè)segment文件存儲(chǔ),每個(gè)Partition都是一個(gè)有序的隊(duì)列诊霹,不同Partition間的數(shù)據(jù)是無(wú)序的羞延。
- Partition中的每條消息都會(huì)被分配一個(gè)有序的ID(即offset)。
Producer - 消息和數(shù)據(jù)的生產(chǎn)者脾还。Producer將消息發(fā)布到Kafka的topic中伴箩。
- Broker接收到Producer發(fā)布的消息后,Broker將該消息追加到當(dāng)前用于追加數(shù)據(jù)的segment文件中鄙漏。
- Producer發(fā)送的消息嗤谚,存儲(chǔ)到一個(gè)Partition中,Producer也可以指定數(shù)據(jù)存儲(chǔ)的Partition怔蚌。
Consumer - 消息和數(shù)據(jù)的消費(fèi)者巩步。Consumer從Broker中讀取數(shù)據(jù)。
- Consumer可以消費(fèi)多個(gè)topic中的數(shù)據(jù)桦踊。
Consumer Group - 每個(gè)消費(fèi)者都屬于一個(gè)特定的消費(fèi)者組椅野。
- 可為每個(gè)Consumer指定group name,若不指定group name則屬于默認(rèn)的group籍胯。
- 一個(gè)Topic可以有多個(gè)消費(fèi)者組竟闪,Topic的消息會(huì)被復(fù)制到所有的消費(fèi)者組中,但每個(gè)消費(fèi)者組只會(huì)把消息發(fā)送給該組中的一個(gè)消費(fèi)者杖狼。
- 消費(fèi)者組是Kafka用來(lái)實(shí)現(xiàn)一個(gè)Topic消息的廣播和單播的手段炼蛤。
Leader - 每個(gè)Partition有多個(gè)副本,其中有且僅有一個(gè)作為leader蝶涩。
- Leader是當(dāng)前負(fù)責(zé)數(shù)據(jù)的讀寫(xiě)的Partition理朋。
Follower - Follower跟隨Leader,所有寫(xiě)請(qǐng)求都通過(guò)Leader路由子寓,數(shù)據(jù)變更會(huì)廣播給所有Follower暗挑,F(xiàn)ollower與Leader保持?jǐn)?shù)據(jù)同步。
- 如果Leader失效斜友,則從Follower中選舉出一個(gè)新的Leader炸裆。
- 如果Follower與Leader掛掉、卡住或同步太慢鲜屏,Leader會(huì)把這個(gè)Follower從"in sync replicas"## 高吞吐量的分布式消息組件Kafka是如何工作的
Kafka是當(dāng)前分布式系統(tǒng)中最流行的消息中間件之一烹看,憑借著其高吞吐量的設(shè)計(jì),在日志收集系統(tǒng)和消息系統(tǒng)的應(yīng)用場(chǎng)景中深得開(kāi)發(fā)者喜愛(ài)洛史。
本篇就聊聊Kafka相關(guān)的一些知識(shí)點(diǎn)惯殊。主要包括以下內(nèi)容:
-
Kafka簡(jiǎn)介
- Kafka特點(diǎn)
- Kafka基本概念
- Kafka架構(gòu)
-
Kafka的幾個(gè)核心概念
- 分區(qū)Partition
- 復(fù)制Replication
- 消息發(fā)送
- 消費(fèi)者組
- 消費(fèi)偏移量
Kafka的工程應(yīng)用
Kafka簡(jiǎn)介
Kafka特點(diǎn)
Kafka是最初由Linkedin公司開(kāi)發(fā),是一個(gè)分布式也殖、分區(qū)的土思、多副本的务热、多訂閱者,基于zookeeper協(xié)調(diào)的分布式日志系統(tǒng)(也可以當(dāng)做MQ系統(tǒng))己儒,常見(jiàn)可以用于web/nginx日志崎岂、訪問(wèn)日志,消息服務(wù)等等闪湾,Linkedin于2010年貢獻(xiàn)給了Apache基金會(huì)并成為頂級(jí)開(kāi)源項(xiàng)目冲甘。
相比于其他的消息隊(duì)列中間件,Kafka的主要設(shè)計(jì)目標(biāo)途样,也即其特點(diǎn)如下:
- 以時(shí)間復(fù)雜度為O(1)的方式提供消息持久化能力江醇,即使對(duì)TB級(jí)以上數(shù)據(jù)也能保證常數(shù)時(shí)間的訪問(wèn)性能。
- 高吞吐率何暇。即使在非常廉價(jià)的商用機(jī)器上也能做到單機(jī)支持每秒100K條消息的傳輸陶夜。
- 支持Kafka Server間的消息分區(qū),及分布式消費(fèi)赖晶,同時(shí)保證每個(gè)partition內(nèi)的消息順序傳輸律适。
- 同時(shí)支持離線數(shù)據(jù)處理和實(shí)時(shí)數(shù)據(jù)處理。
- Scale out:支持在線水平擴(kuò)展
Kafka基本概念
Broker
- Kaka集群中的一臺(tái)或多臺(tái)服務(wù)器稱為Broker遏插。Broker存儲(chǔ)Topic的數(shù)據(jù)。
- 如果某topic有N個(gè)partition纠修,集群有N個(gè)broker胳嘲,那么每個(gè)broker存儲(chǔ)該topic的一個(gè)partition。
- 如果某topic有N個(gè)partition扣草,集群有(N+M)個(gè)broker了牛,那么其中有N個(gè)broker存儲(chǔ)該topic的一個(gè)partition,剩下的M個(gè)broker不存儲(chǔ)該topic的partition數(shù)據(jù)辰妙。
- 如果某topic有N個(gè)partition鹰祸,集群中broker數(shù)目少于N個(gè),那么一個(gè)broker存儲(chǔ)該topic的一個(gè)或多個(gè)partition密浑。在實(shí)際生產(chǎn)環(huán)境中蛙婴,盡量避免這種情況的發(fā)生,這種情況容易導(dǎo)致Kafka集群數(shù)據(jù)不均衡尔破。
Topic
- 發(fā)布到Kafka的每條消息都有一個(gè)類別街图,是個(gè)邏輯概念。
- 物理上不同Topic的消息分開(kāi)存儲(chǔ)懒构,邏輯上一個(gè)Topic的消息雖然保存于一個(gè)或多個(gè)broker上餐济,但用戶只需指定消息的Topic即可生產(chǎn)或消費(fèi)數(shù)據(jù)而不必關(guān)心數(shù)據(jù)存于何處
Partition
- 物理上的Topic分區(qū),一個(gè)Topic可以分為多個(gè)Partition胆剧,至少有一個(gè)Partition絮姆。
- 每個(gè)Partition中的數(shù)據(jù)使用多個(gè)segment文件存儲(chǔ),每個(gè)Partition都是一個(gè)有序的隊(duì)列,不同Partition間的數(shù)據(jù)是無(wú)序的篙悯。
- Partition中的每條消息都會(huì)被分配一個(gè)有序的ID(即offset)冤灾。
Producer
- 消息和數(shù)據(jù)的生產(chǎn)者。Producer將消息發(fā)布到Kafka的topic中辕近。
- Broker接收到Producer發(fā)布的消息后韵吨,Broker將該消息追加到當(dāng)前用于追加數(shù)據(jù)的segment文件中。
- Producer發(fā)送的消息移宅,存儲(chǔ)到一個(gè)Partition中归粉,Producer也可以指定數(shù)據(jù)存儲(chǔ)的Partition。
Consumer
- 消息和數(shù)據(jù)的消費(fèi)者漏峰。Consumer從Broker中讀取數(shù)據(jù)糠悼。
- Consumer可以消費(fèi)多個(gè)topic中的數(shù)據(jù)。
Consumer Group
- 每個(gè)消費(fèi)者都屬于一個(gè)特定的消費(fèi)者組浅乔。
- 可為每個(gè)Consumer指定group name倔喂,若不指定group name則屬于默認(rèn)的group。
- 一個(gè)Topic可以有多個(gè)消費(fèi)者組靖苇,Topic的消息會(huì)被復(fù)制到所有的消費(fèi)者組中席噩,但每個(gè)消費(fèi)者組只會(huì)把消息發(fā)送給該組中的一個(gè)消費(fèi)者。
- 消費(fèi)者組是Kafka用來(lái)實(shí)現(xiàn)一個(gè)Topic消息的廣播和單播的手段贤壁。
Leader
- 每個(gè)Partition有多個(gè)副本悼枢,其中有且僅有一個(gè)作為leader。
- Leader是當(dāng)前負(fù)責(zé)數(shù)據(jù)的讀寫(xiě)的Partition脾拆。
Follower
- Follower跟隨Leader馒索,所有寫(xiě)請(qǐng)求都通過(guò)Leader路由,數(shù)據(jù)變更會(huì)廣播給所有Follower名船,F(xiàn)ollower與Leader保持?jǐn)?shù)據(jù)同步绰上。
- 如果Leader失效,則從Follower中選舉出一個(gè)新的Leader渠驼。
- 如果Follower與Leader掛掉蜈块、卡住或同步太慢,Leader會(huì)把這個(gè)Follower從"in sync replicas"列表中刪除渴邦,重新創(chuàng)建一個(gè)Follower疯趟。
Kafka架構(gòu)
Kafka一般以集群方式來(lái)部署,一個(gè)典型的Kafka集群架構(gòu)如下圖所示:
[圖片上傳失敗...(image-7c5767-1580829260873)]
Kafka的幾個(gè)核心概念
分區(qū)Partition
分區(qū)的幾個(gè)特點(diǎn)
- 分區(qū)是Kafka的基本存儲(chǔ)單元谋梭,在一個(gè)Topic中會(huì)有一個(gè)或多個(gè)Partition信峻,不同的Partition可位于不同的服務(wù)器節(jié)點(diǎn)上,物理上一個(gè)Partition對(duì)應(yīng)于一個(gè)文件夾瓮床。
- Partition內(nèi)包含一個(gè)或多個(gè)Segment盹舞,每個(gè)Segment又包含一個(gè)數(shù)據(jù)文件和一個(gè)與之對(duì)應(yīng)的索引文件产镐。
- 對(duì)于寫(xiě)操作,每次只會(huì)寫(xiě)Partition內(nèi)的一個(gè)Segment踢步;對(duì)于讀操作癣亚,也只會(huì)順序讀取同一個(gè)Partition內(nèi)的不同Segment。
- 邏輯上获印,可以把Partition當(dāng)做一個(gè)非常長(zhǎng)的數(shù)組述雾,使用時(shí)通過(guò)這個(gè)數(shù)組的索引(offset)訪問(wèn)數(shù)據(jù)。
高吞吐量設(shè)計(jì)
分區(qū)正是Kafka高吞吐量設(shè)計(jì)的方法之一兼丰,具體體現(xiàn)在這樣幾點(diǎn): - 由于不同的Partition可位于不同的機(jī)器上玻孟,因此可以實(shí)現(xiàn)機(jī)器間的并行處理。
- 由于一個(gè)Partition對(duì)應(yīng)一個(gè)文件夾鳍征,多個(gè)Partition也可位于同一臺(tái)服務(wù)器上黍翎,這樣就可以在同一臺(tái)服務(wù)器上使不同的Partition對(duì)應(yīng)不同的磁盤(pán),實(shí)現(xiàn)磁盤(pán)間的并行處理艳丛。
- 故一般通過(guò)增加Partition的數(shù)量來(lái)提高系統(tǒng)的并行吞吐量匣掸,但也會(huì)增加輕微的延遲。
但以下這幾種情況需要注意: - 當(dāng)一個(gè)Topic有多個(gè)消費(fèi)者時(shí)氮双,一個(gè)消息只會(huì)被一個(gè)消費(fèi)者組里的一個(gè)消費(fèi)者消費(fèi)碰酝;
- 由于消息是以Partition為單位分配的,在不考慮Rebalance時(shí)眶蕉,同一個(gè)Partition的數(shù)據(jù)只會(huì)被一個(gè)消費(fèi)者消費(fèi)砰粹,所以如果消費(fèi)者的數(shù)量多于Partition的數(shù)量,就會(huì)存在部分消費(fèi)者不能消費(fèi)該Topic的情況造挽,此時(shí)再增加消費(fèi)者并不能提高系統(tǒng)的吞吐量;
- 在生產(chǎn)者和Broker的角度弄痹,對(duì)不同Partition的寫(xiě)操作是完全并行的饭入,可是對(duì)于消費(fèi)者其并發(fā)數(shù)則取決于Partition的數(shù)量。實(shí)際中配置的Partition數(shù)量需要根據(jù)所設(shè)計(jì)的系統(tǒng)吞吐量來(lái)推算肛真。
復(fù)制
復(fù)制原理
Kafka利用zookeeper來(lái)維護(hù)集群成員的信息谐丢,每個(gè)Broker實(shí)例都會(huì)被設(shè)置一個(gè)唯一的標(biāo)識(shí)符,Broker在啟動(dòng)時(shí)會(huì)通過(guò)創(chuàng)建臨時(shí)節(jié)點(diǎn)的方式把自己的唯一標(biāo)識(shí)注冊(cè)到zookeeper中蚓让,Kafka中的其他組件會(huì)監(jiān)視Zookeeper里的/broker/ids路徑乾忱,所以當(dāng)集群中有Broker加入或退出時(shí),其他組件就會(huì)收到通知历极。
集群間數(shù)據(jù)的復(fù)制機(jī)制窄瘟,在Kafka中是通過(guò)Zookeeper提供的leader選舉方式實(shí)現(xiàn)數(shù)據(jù)復(fù)制方案。
基本原理是:首先選舉出一個(gè)leader趟卸,其他副本作為Follower蹄葱,所有的寫(xiě)操作都先發(fā)給leader氏义,然后再由leader把消息發(fā)給Follower。
復(fù)制功能是Kafka架構(gòu)的核心之一图云,因?yàn)樗梢栽趥€(gè)別節(jié)點(diǎn)不可用時(shí)還能保證Kafka整體的可用性惯悠。
Kafka中的復(fù)制操作也是針對(duì)分區(qū)的。一個(gè)分區(qū)有多個(gè)副本竣况,副本被保存在Broker上克婶,每個(gè)Broker都可以保存上千個(gè)屬于不同Topic和分區(qū)的副本。
副本有兩種類型:
- leader副本:每個(gè)分區(qū)都會(huì)有丹泉,所有生產(chǎn)者和消費(fèi)者的請(qǐng)求都會(huì)經(jīng)過(guò)leader情萤;
- follower副本:不處理客戶端的請(qǐng)求,它的職責(zé)是從leader處復(fù)制消息數(shù)據(jù)嘀掸,使自己和leader的狀態(tài)保持一致紫岩;
- 如果leader節(jié)點(diǎn)宕機(jī),那么某個(gè)follower就會(huì)被選為leader繼續(xù)對(duì)外提供服務(wù)睬塌;
- 復(fù)制因子:一個(gè)分區(qū)有幾個(gè)副本泉蝌。
消息發(fā)送方式
從生產(chǎn)者的角度來(lái)看,消息發(fā)送到Broker有三種方式:
- 立即發(fā)送:只發(fā)送消息揩晴,不關(guān)心消息發(fā)送的結(jié)果勋陪。本質(zhì)上也是一種異步發(fā)送的方式,消息先存儲(chǔ)在緩沖區(qū)中硫兰,達(dá)到設(shè)定條件后批量發(fā)送诅愚。當(dāng)然這是kafka吞吐量最高的一種方式,并配合參數(shù)acks=0,這樣生產(chǎn)者不需要等待服務(wù)器的響應(yīng)劫映,以網(wǎng)絡(luò)能支持的最大速度發(fā)送消息违孝。但是也是消息最不可靠的一種方式,因?yàn)閷?duì)于發(fā)送失敗的消息沒(méi)有做任何處理泳赋。
- 同步發(fā)送:生產(chǎn)者發(fā)送消息后獲取返回的Future對(duì)象雌桑,根據(jù)該對(duì)象的結(jié)果查看發(fā)送是否成功。如果業(yè)務(wù)要求消息必須是按順序發(fā)送的祖今,那么可以使用同步的方式校坑,并且只能在一個(gè)partation上,結(jié)合參數(shù)設(shè)置retries的值讓發(fā)送失敗時(shí)重試千诬,設(shè)置max_in_flight_requests_per_connection=1耍目,可以控制生產(chǎn)者在收到服務(wù)器晌應(yīng)之前只能發(fā)送1個(gè)消息,在消息發(fā)送成功后立刻flush徐绑,從而控制消息順序發(fā)送邪驮。
- 異步發(fā)送:生產(chǎn)者發(fā)送消息時(shí)將注冊(cè)的回調(diào)函數(shù)作為入?yún)魅耄a(chǎn)者接收到Kafka服務(wù)器的響應(yīng)時(shí)會(huì)觸發(fā)執(zhí)行回調(diào)函數(shù)泵三。如果業(yè)務(wù)需要知道消息發(fā)送是否成功耕捞,并且對(duì)消息的順序不關(guān)心衔掸,那么可以用異步+回調(diào)的方式來(lái)發(fā)送消息,配合參數(shù)retries=0俺抽,并將發(fā)送失敗的消息記錄到日志文件中敞映。
消息發(fā)送確認(rèn)
消息發(fā)送到Broker后怎么算投遞成功呢,Kafka有三種確認(rèn)模式:
- 不等Broker確認(rèn)就認(rèn)為投遞成功磷斧;
- 由leader來(lái)確認(rèn)投遞成功振愿;
- 由所有的leader和follower都確認(rèn)才認(rèn)為是成功的。
三種模式對(duì)比的話弛饭,性能依次降低冕末,但可靠性依次提高。
消息重發(fā)機(jī)制
當(dāng)從Broker接收到的是臨時(shí)可恢復(fù)的異常時(shí)侣颂,生產(chǎn)者會(huì)向Broker重發(fā)消息档桃,重發(fā)次數(shù)的限制值由初始化生產(chǎn)者對(duì)象的retries屬性決定,在默認(rèn)情況下生產(chǎn)者會(huì)在重試后等待100ms憔晒,可以通過(guò)retry.backoff.ms屬性進(jìn)行修改藻肄。
批次發(fā)送
當(dāng)有多條消息要被發(fā)送到同一個(gè)分區(qū)時(shí),生產(chǎn)者會(huì)把它們放到同一個(gè)批次里拒担,Kafka通過(guò)批次的概念來(lái)提高吞吐量嘹屯,但同時(shí)也會(huì)增加延遲。
對(duì)批次的控制主要通過(guò)構(gòu)建生產(chǎn)者對(duì)象時(shí)的兩個(gè)屬性來(lái)實(shí)現(xiàn):
- batch.size:當(dāng)發(fā)往每個(gè)分區(qū)的緩存消息數(shù)量達(dá)到這個(gè)數(shù)值時(shí)从撼,就會(huì)觸發(fā)一次網(wǎng)絡(luò)請(qǐng)求州弟,批次里的所有消息都會(huì)被發(fā)送出去;
- linger.ms:每條消息在緩存中的最長(zhǎng)時(shí)間低零,如果超過(guò)這個(gè)時(shí)間就會(huì)忽略batch.size的限制婆翔,由客戶端立即把消息發(fā)送出去。
消費(fèi)者組
消費(fèi)者組是Kafka提供的可擴(kuò)展且具有容錯(cuò)性的消費(fèi)機(jī)制掏婶,在一個(gè)消費(fèi)者組內(nèi)可以有多個(gè)消費(fèi)者浙滤,它們共享一個(gè)唯一標(biāo)識(shí),即分組ID气堕。組內(nèi)的所有消費(fèi)者協(xié)調(diào)消費(fèi)它們訂閱的主題下的所有分區(qū)的消息,但一個(gè)分區(qū)只能由同一個(gè)消費(fèi)者組里的一個(gè)消費(fèi)者來(lái)消費(fèi)畔咧。
廣播和單播
一個(gè)Topic可以有多個(gè)消費(fèi)者組茎芭,Topic的消息會(huì)被復(fù)制到所有的消費(fèi)者組中,但每個(gè)消費(fèi)者組只會(huì)把消息發(fā)送給一個(gè)消費(fèi)者組里的某一個(gè)消費(fèi)者誓沸。
如果要實(shí)現(xiàn)廣播梅桩,只需為每個(gè)消費(fèi)者都分配一個(gè)單獨(dú)的消費(fèi)者組接口
如果要實(shí)現(xiàn)單播,則需要把所有的消費(fèi)者都設(shè)置在同一個(gè)消費(fèi)者組里
再均衡
消費(fèi)者組里有新消費(fèi)者加入或者有消費(fèi)者離開(kāi)拜隧,分區(qū)所有權(quán)會(huì)從一個(gè)消費(fèi)者轉(zhuǎn)移到另一個(gè)消費(fèi)者
再均衡協(xié)議規(guī)定了一個(gè)消費(fèi)者組下的所有消費(fèi)者如何達(dá)成一致來(lái)分配主題下的每個(gè)分區(qū)
觸發(fā)再均衡的場(chǎng)景有三種:
- 一是消費(fèi)者組內(nèi)成員發(fā)生變更
- 二是訂閱的主題數(shù)量發(fā)生表更
- 三是訂閱主題的分區(qū)數(shù)量發(fā)生變更
消費(fèi)偏移量
Kafka中有一個(gè)叫作_consumer_offset特殊主題用來(lái)保存消息在每個(gè)分區(qū)的偏移量宿百,消費(fèi)者每次消費(fèi)時(shí)都會(huì)往這個(gè)主題中發(fā)送消息趁仙,消息包含每個(gè)分區(qū)的偏移量。
如果消費(fèi)者一直處于運(yùn)行狀態(tài)垦页,偏移量沒(méi)什么作用雀费;如果消費(fèi)者崩潰或者有新的消費(fèi)者加入消費(fèi)者組從而觸發(fā)再均衡操作,再均衡之后該分區(qū)的消費(fèi)者若不是之前的那個(gè)痊焊,提交偏移量就有用了盏袄。
維護(hù)消息偏移量對(duì)于避免消息被重復(fù)消費(fèi)和遺漏消費(fèi),確保消息的ExactlyOnce至關(guān)重要薄啥,以下是不同的提交偏移量的方式:
- 自動(dòng)提交:Kafka默認(rèn)會(huì)定期自動(dòng)提交偏移量辕羽,提交的時(shí)間間隔默認(rèn)是5秒。此方式會(huì)產(chǎn)生重復(fù)處理消息的問(wèn)題垄惧;
- 手動(dòng)提交:在進(jìn)行手動(dòng)提交之前需要先關(guān)閉消費(fèi)者的自動(dòng)提交配置刁愿,然后用commitSync方法來(lái)提交偏移量。處理完記錄后由開(kāi)發(fā)者確保調(diào)用了commitSync方法到逊,來(lái)減少重復(fù)處理消息的數(shù)量铣口,但可能降低消費(fèi)者的吞吐量;
- 異步提交:使用commitASync方法來(lái)提交最后一個(gè)偏移量蕾管。消費(fèi)者只管發(fā)送提交請(qǐng)求枷踏,而不需要等待Broker的立即回應(yīng)。
Kafka的工程應(yīng)用
Kafka主要用于三種場(chǎng)景:
- 基于Kafka的用戶行為數(shù)據(jù)采集
- 基于Kafka的日志收集
- 基于Kafka的流量削峰
基于Kafka的用戶行為數(shù)據(jù)采集
要獲取必要的數(shù)據(jù)進(jìn)行用戶行為等的分析掰曾,需要這樣幾個(gè)步驟:
- 前端數(shù)據(jù)(埋點(diǎn))上報(bào)
- 接收前端數(shù)據(jù)請(qǐng)求
- 后端通過(guò)Kafka消費(fèi)消息旭蠕,必要時(shí)落庫(kù)
- 分析用戶行為
基于Kafka的日志收集
各個(gè)應(yīng)用系統(tǒng)在輸出日志時(shí)利用高吞吐量的Kafka作為數(shù)據(jù)緩沖平臺(tái),將日志統(tǒng)一輸出到Kafka旷坦,再通過(guò)Kafka以統(tǒng)一接口服務(wù)的方式開(kāi)放給各種消費(fèi)者掏熬。
做統(tǒng)一日志平臺(tái)的方案,收集重要系統(tǒng)的日志集中到Kafka中秒梅,然后再導(dǎo)入ElasticSearch旗芬、HDFS、Storm等具體日志數(shù)據(jù)的消費(fèi)者中捆蜀,用于進(jìn)行實(shí)時(shí)搜索分析疮丛、離線統(tǒng)計(jì)、數(shù)據(jù)備份辆它、大數(shù)據(jù)分析等誊薄。
基于Kafka的流量削峰
為了讓系統(tǒng)在大流量場(chǎng)景下仍然可用,可以在系統(tǒng)中的重點(diǎn)業(yè)務(wù)環(huán)節(jié)加入消息隊(duì)列作為消息流的緩沖锰茉,從而避免短時(shí)間內(nèi)產(chǎn)生的高流量帶來(lái)的壓垮整個(gè)應(yīng)用的問(wèn)題呢蔫。