Kafka系列1: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)如下:

  1. 以時(shí)間復(fù)雜度為O(1)的方式提供消息持久化能力甫煞,即使對(duì)TB級(jí)以上數(shù)據(jù)也能保證常數(shù)時(shí)間的訪問(wèn)性能菇曲。
  2. 高吞吐率。即使在非常廉價(jià)的商用機(jī)器上也能做到單機(jī)支持每秒100K條消息的傳輸抚吠。
  3. 支持Kafka Server間的消息分區(qū)常潮,及分布式消費(fèi),同時(shí)保證每個(gè)partition內(nèi)的消息順序傳輸楷力。
  4. 同時(shí)支持離線數(shù)據(jù)處理和實(shí)時(shí)數(shù)據(jù)處理喊式。
  5. 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)如下:

  1. 以時(shí)間復(fù)雜度為O(1)的方式提供消息持久化能力江醇,即使對(duì)TB級(jí)以上數(shù)據(jù)也能保證常數(shù)時(shí)間的訪問(wèn)性能。
  2. 高吞吐率何暇。即使在非常廉價(jià)的商用機(jī)器上也能做到單機(jī)支持每秒100K條消息的傳輸陶夜。
  3. 支持Kafka Server間的消息分區(qū),及分布式消費(fèi)赖晶,同時(shí)保證每個(gè)partition內(nèi)的消息順序傳輸律适。
  4. 同時(shí)支持離線數(shù)據(jù)處理和實(shí)時(shí)數(shù)據(jù)處理。
  5. 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)題呢蔫。

關(guān)注我的公眾號(hào),獲取更多關(guān)于面試飒筑、技術(shù)的文章及福利資源片吊。

kafka架構(gòu)圖.jpg
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绽昏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子俏脊,更是在濱河造成了極大的恐慌全谤,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件联予,死亡現(xiàn)場(chǎng)離奇詭異啼县,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)沸久,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門(mén)季眷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人卷胯,你說(shuō)我怎么就攤上這事子刮。” “怎么了窑睁?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵挺峡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我担钮,道長(zhǎng)橱赠,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任箫津,我火速辦了婚禮狭姨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘苏遥。我一直安慰自己饼拍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布田炭。 她就那樣靜靜地躺著师抄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪教硫。 梳的紋絲不亂的頭發(fā)上叨吮,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音瞬矩,去河邊找鬼挤安。 笑死,一個(gè)胖子當(dāng)著我的面吹牛丧鸯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嫩絮,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼丛肢,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼围肥!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蜂怎,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤穆刻,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后杠步,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體氢伟,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年幽歼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了朵锣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡甸私,死狀恐怖诚些,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情皇型,我是刑警寧澤诬烹,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站弃鸦,受9級(jí)特大地震影響绞吁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜唬格,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一家破、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧西轩,春花似錦员舵、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至注服,卻和暖如春韭邓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背溶弟。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工女淑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辜御。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓鸭你,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子袱巨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容