怎樣解析Kafka基本原理

這篇文章給大家介紹怎樣解析Kafka基本原理,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

專(zhuān)業(yè)領(lǐng)域包括網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì)商城網(wǎng)站開(kāi)發(fā)、微信營(yíng)銷(xiāo)、系統(tǒng)平臺(tái)開(kāi)發(fā), 與其他網(wǎng)站設(shè)計(jì)及系統(tǒng)開(kāi)發(fā)公司不同,創(chuàng)新互聯(lián)的整合解決方案結(jié)合了幫做網(wǎng)絡(luò)品牌建設(shè)經(jīng)驗(yàn)和互聯(lián)網(wǎng)整合營(yíng)銷(xiāo)的理念,并將策略和執(zhí)行緊密結(jié)合,為客戶(hù)提供全網(wǎng)互聯(lián)網(wǎng)整合方案。

簡(jiǎn)介

Apache Kafka是分布式發(fā)布-訂閱消息系統(tǒng)。它最初由LinkedIn公司開(kāi)發(fā),之后成為Apache項(xiàng)目的一部分。Kafka是一種快速、可擴(kuò)展的、設(shè)計(jì)內(nèi)在就是分布式的,分區(qū)的和可復(fù)制的提交日志服務(wù)。

Kafka架構(gòu)

它的架構(gòu)包括以下組件:

  • 話(huà)題(Topic):是特定類(lèi)型的消息流。消息是字節(jié)的有效負(fù)載(Payload),話(huà)題是消息的分類(lèi)名或種子(Feed)名。

  • 生產(chǎn)者(Producer):是能夠發(fā)布消息到話(huà)題的任何對(duì)象。

  • 服務(wù)代理(Broker):已發(fā)布的消息保存在一組服務(wù)器中,它們被稱(chēng)為代理(Broker)或Kafka集群。

  • 消費(fèi)者(Consumer):可以訂閱一個(gè)或多個(gè)話(huà)題,并從Broker拉數(shù)據(jù),從而消費(fèi)這些已發(fā)布的消息。

怎樣解析Kafka基本原理

Kafka存儲(chǔ)策略

1)kafka以topic來(lái)進(jìn)行消息管理,每個(gè)topic包含多個(gè)partition,每個(gè)partition對(duì)應(yīng)一個(gè)邏輯log,有多個(gè)segment組成。

2)每個(gè)segment中存儲(chǔ)多條消息(見(jiàn)下圖),消息id由其邏輯位置決定,即從消息id可直接定位到消息的存儲(chǔ)位置,避免id到位置的額外映射。

3)每個(gè)part在內(nèi)存中對(duì)應(yīng)一個(gè)index,記錄每個(gè)segment中的第一條消息偏移。

4)發(fā)布者發(fā)到某個(gè)topic的消息會(huì)被均勻的分布到多個(gè)partition上(或根據(jù)用戶(hù)指定的路由規(guī)則進(jìn)行分布),broker收到發(fā)布消息往對(duì)應(yīng)partition的最后一個(gè)segment上添加該消息,當(dāng)某個(gè)segment上的消息條數(shù)達(dá)到配置值或消息發(fā)布時(shí)間超過(guò)閾值時(shí),segment上的消息會(huì)被flush到磁盤(pán),只有flush到磁盤(pán)上的消息訂閱者才能訂閱到,segment達(dá)到一定的大小后將不會(huì)再往該segment寫(xiě)數(shù)據(jù),broker會(huì)創(chuàng)建新的segment。

怎樣解析Kafka基本原理

Kafka刪除策略

1)N天前的刪除。

2)保留最近的MGB數(shù)據(jù)。

Kafka broker

與其它消息系統(tǒng)不同,Kafka broker是無(wú)狀態(tài)的。這意味著消費(fèi)者必須維護(hù)已消費(fèi)的狀態(tài)信息。這些信息由消費(fèi)者自己維護(hù),broker完全不管(有offset managerbroker管理)。

  • 從代理刪除消息變得很棘手,因?yàn)榇聿⒉恢老M(fèi)者是否已經(jīng)使用了該消息。Kafka創(chuàng)新性地解決了這個(gè)問(wèn)題,它將一個(gè)簡(jiǎn)單的基于時(shí)間的SLA應(yīng)用于保留策略。當(dāng)消息在代理中超過(guò)一定時(shí)間后,將會(huì)被自動(dòng)刪除。

  • 這種創(chuàng)新設(shè)計(jì)有很大的好處,消費(fèi)者可以故意倒回到老的偏移量再次消費(fèi)數(shù)據(jù)。這違反了隊(duì)列的常見(jiàn)約定,但被證明是許多消費(fèi)者的基本特征。

以下摘抄自kafka官方文檔:

Kafka Design

目標(biāo)

1) 高吞吐量來(lái)支持高容量的事件流處理

2) 支持從離線(xiàn)系統(tǒng)加載數(shù)據(jù)

3) 低延遲的消息系統(tǒng)

持久化

1) 依賴(lài)文件系統(tǒng),持久化到本地

2) 數(shù)據(jù)持久化到log

效率

1) 解決”small IO problem“:

使用”message set“組合消息。

server使用”chunks of messages“寫(xiě)到log。

consumer一次獲取大的消息塊。

2)解決”byte copying“:

在producer、broker和consumer之間使用統(tǒng)一的binary message format。

使用系統(tǒng)的pagecache。

使用sendfile傳輸log,避免拷貝。

端到端的批量壓縮(End-to-end Batch Compression)

Kafka支持GZIP和Snappy壓縮協(xié)議。

The Producer

負(fù)載均衡

1)producer可以自定義發(fā)送到哪個(gè)partition的路由規(guī)則。默認(rèn)路由規(guī)則:hash(key)%numPartitions,如果key為null則隨機(jī)選擇一個(gè)partition。

2)自定義路由:如果key是一個(gè)user id,可以把同一個(gè)user的消息發(fā)送到同一個(gè)partition,這時(shí)consumer就可以從同一個(gè)partition讀取同一個(gè)user的消息。

異步批量發(fā)送

批量發(fā)送:配置不多于固定消息數(shù)目一起發(fā)送并且等待時(shí)間小于一個(gè)固定延遲的數(shù)據(jù)。

The Consumer

consumer控制消息的讀取。

Push vs Pull

1)producer push data to broker,consumer pull data from broker

2)consumer pull的優(yōu)點(diǎn):consumer自己控制消息的讀取速度和數(shù)量。

3)consumer pull的缺點(diǎn):如果broker沒(méi)有數(shù)據(jù),則可能要pull多次忙等待,Kafka可以配置consumer long pull一直等到有數(shù)據(jù)。

Consumer Position

1)大部分消息系統(tǒng)由broker記錄哪些消息被消費(fèi)了,但Kafka不是。

2)Kafka由consumer控制消息的消費(fèi),consumer甚至可以回到一個(gè)old offset的位置再次消費(fèi)消息。

Message Delivery Semantics

三種:

At most once—Messages may be lost but are never redelivered.

At least once—Messages are never lost but may be redelivered.

Exactly once—this is what people actually want, each message is delivered once and only once.

Producer:有個(gè)”acks“配置可以控制接收的leader的在什么情況下就回應(yīng)producer消息寫(xiě)入成功。

Consumer:

* 讀取消息,寫(xiě)log,處理消息。如果處理消息失敗,log已經(jīng)寫(xiě)入,則無(wú)法再次處理失敗的消息,對(duì)應(yīng)”At most once“。

* 讀取消息,處理消息,寫(xiě)log。如果消息處理成功,寫(xiě)log失敗,則消息會(huì)被處理兩次,對(duì)應(yīng)”At least once“。

* 讀取消息,同時(shí)處理消息并把result和log同時(shí)寫(xiě)入。這樣保證result和log同時(shí)更新或同時(shí)失敗,對(duì)應(yīng)”Exactly once“。

Kafka默認(rèn)保證at-least-once delivery,容許用戶(hù)實(shí)現(xiàn)at-most-once語(yǔ)義,exactly-once的實(shí)現(xiàn)取決于目的存儲(chǔ)系統(tǒng),kafka提供了讀取offset,實(shí)現(xiàn)也沒(méi)有問(wèn)題。

復(fù)制(Replication)

1)一個(gè)partition的復(fù)制個(gè)數(shù)(replication factor)包括這個(gè)partition的leader本身。

2)所有對(duì)partition的讀和寫(xiě)都通過(guò)leader。

3)Followers通過(guò)pull獲取leader上log(message和offset)

4)如果一個(gè)follower掛掉、卡住或者同步太慢,leader會(huì)把這個(gè)follower從”in sync replicas“(ISR)列表中刪除。

5)當(dāng)所有的”in sync replicas“的follower把一個(gè)消息寫(xiě)入到自己的log中時(shí),這個(gè)消息才被認(rèn)為是”committed“的。

6)如果針對(duì)某個(gè)partition的所有復(fù)制節(jié)點(diǎn)都掛了,Kafka選擇最先復(fù)活的那個(gè)節(jié)點(diǎn)作為leader(這個(gè)節(jié)點(diǎn)不一定在ISR里)。

日志壓縮(Log Compaction)

1)針對(duì)一個(gè)topic的partition,壓縮使得Kafka至少知道每個(gè)key對(duì)應(yīng)的最后一個(gè)值。

2)壓縮不會(huì)重排序消息。

3)消息的offset是不會(huì)變的。

4)消息的offset是順序的。

Distribution

Consumer Offset Tracking

1)High-level consumer記錄每個(gè)partition所消費(fèi)的maximum offset,并定期commit到offset manager(broker)。

2)Simple consumer需要手動(dòng)管理offset?,F(xiàn)在的Simple consumer Java API只支持commit offset到zookeeper。

Consumers and Consumer Groups

1)consumer注冊(cè)到zookeeper

2)屬于同一個(gè)group的consumer(group id一樣)平均分配partition,每個(gè)partition只會(huì)被一個(gè)consumer消費(fèi)。

3)當(dāng)broker或同一個(gè)group的其他consumer的狀態(tài)發(fā)生變化的時(shí)候,consumer rebalance就會(huì)發(fā)生。

Zookeeper協(xié)調(diào)控制

1)管理broker與consumer的動(dòng)態(tài)加入與離開(kāi)。

2)觸發(fā)負(fù)載均衡,當(dāng)broker或consumer加入或離開(kāi)時(shí)會(huì)觸發(fā)負(fù)載均衡算法,使得一個(gè)consumer group內(nèi)的多個(gè)consumer的訂閱負(fù)載平衡。

3)維護(hù)消費(fèi)關(guān)系及每個(gè)partition的消費(fèi)信息。

關(guān)于怎樣解析Kafka基本原理就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

名稱(chēng)欄目:怎樣解析Kafka基本原理
鏈接分享:http://muchs.cn/article2/phogoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄網(wǎng)站策劃、面包屑導(dǎo)航外貿(mào)網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站營(yíng)銷(xiāo)型網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁(yè)設(shè)計(jì)公司