精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java工程師的進(jìn)階之路Kafka篇

開(kāi)發(fā) 后端 Kafka
Kafka 是最初由 Linkedin 公司開(kāi)發(fā),是一個(gè)分布式、支持分區(qū)的(partition)、多副本的(replica),基于zookeeper 協(xié)調(diào)的分布式消息系統(tǒng),它的最大的特性就是可以實(shí)時(shí)的處理大量數(shù)據(jù)以滿(mǎn)足各種需求場(chǎng)景。

 1. Kafka 誕生背景

Kafka 是最初由 Linkedin 公司開(kāi)發(fā),是一個(gè)分布式、支持分區(qū)的(partition)、多副本的(replica),基于 zookeeper 協(xié)調(diào)的分布式消息系統(tǒng),它的最大的特性就是可以實(shí)時(shí)的處理大量數(shù)據(jù)以滿(mǎn)足各種需求場(chǎng)景:比如基于 hadoop 的批處理系統(tǒng)、低延遲的實(shí)時(shí)系統(tǒng)、storm/Spark 流式處理引擎,web/nginx 日志、訪(fǎng)問(wèn)日志,消息服務(wù)等等,用 scala 語(yǔ)言編寫(xiě),Linkedin 于 2010 年貢獻(xiàn)給了 Apache 基金會(huì)并成為頂級(jí)開(kāi)源項(xiàng)目。

當(dāng)今社會(huì)各種應(yīng)用系統(tǒng)諸如商業(yè)、社交、搜索、瀏覽等像信息工廠一樣不斷的生產(chǎn)出各種信息,在大數(shù)據(jù)時(shí)代,我們面臨如下幾個(gè)挑戰(zhàn):

  1.  如何收集這些巨大的信息;
  2.  如何分析它;
  3.  如何及時(shí)做到如上兩點(diǎn);

以上幾個(gè)挑戰(zhàn)形成了一個(gè)業(yè)務(wù)需求模型,即 生產(chǎn)者生產(chǎn)(produce)各種信息,消費(fèi)者消費(fèi)(consume)(處理分析)這些信息,而在生產(chǎn)者與消費(fèi)者之間,需要一個(gè)溝通兩者的橋梁-消息系統(tǒng) 。從一個(gè)微觀層面來(lái)說(shuō),這種需求也可理解為不同的系統(tǒng)之間如何傳遞消息。

Kafka 一個(gè)分布式消息系統(tǒng)應(yīng)運(yùn)而生:

  1.  Kafka-由 linked-in 開(kāi)源;
  2.  kafka-即是解決上述這類(lèi)問(wèn)題的一個(gè)框架,它實(shí)現(xiàn)了生產(chǎn)者和消費(fèi)者之間的無(wú)縫連接;
  3.  kafka-高產(chǎn)出的分布式消息系統(tǒng)(A high-throughput distributed messaging system);

2. 為何使用消息系統(tǒng)

  •  解耦

允許你獨(dú)立的擴(kuò)展或修改兩邊的處理過(guò)程,只要確保它們遵守同樣的接口約束。

  •  冗余

消息隊(duì)列把數(shù)據(jù)進(jìn)行持久化直到它們已經(jīng)被完全處理,通過(guò)這一方式規(guī)避了數(shù)據(jù)丟失風(fēng)險(xiǎn)。許多消息隊(duì)列所采用的"插入-獲取-刪除"范式中,在把一個(gè)消息從隊(duì)列中刪除之前,需要你的處理系統(tǒng)明確的指出該消息已經(jīng)被處理完畢,從而確保你的數(shù)據(jù)被安全的保存直到你使用完畢。

  •  擴(kuò)展性

因?yàn)橄㈥?duì)列解耦了你的處理過(guò)程,所以增大消息入隊(duì)和處理的頻率是很容易的,只要另外增加處理過(guò)程即可。

  •  靈活性 & 峰值處理能力

在訪(fǎng)問(wèn)量劇增的情況下,應(yīng)用仍然需要繼續(xù)發(fā)揮作用,但是這樣的突發(fā)流量并不常見(jiàn)。如果為以能處理這類(lèi)峰值訪(fǎng)問(wèn)為標(biāo)準(zhǔn)來(lái)投入資源隨時(shí)待命無(wú)疑是巨大的浪費(fèi)。使用消息隊(duì)列能夠使關(guān)鍵組件頂住突發(fā)的訪(fǎng)問(wèn)壓力,而不會(huì)因?yàn)橥话l(fā)的超負(fù)荷的請(qǐng)求而完全崩潰。

  •  可恢復(fù)性

系統(tǒng)的一部分組件失效時(shí),不會(huì)影響到整個(gè)系統(tǒng)。消息隊(duì)列降低了進(jìn)程間的耦合度,所以即使一個(gè)處理消息的進(jìn)程掛掉,加入隊(duì)列中的消息仍然可以在系統(tǒng)恢復(fù)后被處理。

  •  順序保證

在大多使用場(chǎng)景下,數(shù)據(jù)處理的順序都很重要。大部分消息隊(duì)列本來(lái)就是排序的,并且能保證數(shù)據(jù)會(huì)按照特定的順序來(lái)處理。(Kafka 保證一個(gè) Partition 內(nèi)的消息的有序性)

  •  緩沖

有助于控制和優(yōu)化數(shù)據(jù)流經(jīng)過(guò)系統(tǒng)的速度,解決生產(chǎn)消息和消費(fèi)消息的處理速度不一致的情況。

  •  異步通信

很多時(shí)候,用戶(hù)不想也不需要立即處理消息。消息隊(duì)列提供了異步處理機(jī)制,允許用戶(hù)把一個(gè)消息放入隊(duì)列,但并不立即處理它。想向隊(duì)列中放入多少消息就放多少,然后在需要的時(shí)候再去處理它們。

3. Kafka 基本架構(gòu)

3.1. 拓?fù)浣Y(jié)構(gòu)

3.2. 名詞概念

  •  producer :消息生產(chǎn)者,發(fā)布消息到 kafka 集群的終端或服務(wù)。
  •  broker :kafka 集群中包含的服務(wù)器。
  •  topic :每條發(fā)布到 kafka 集群的消息屬于的類(lèi)別,即 kafka 是面向 topic 的。
  •  partition :partition 是物理上的概念,每個(gè) topic 包含一個(gè)或多個(gè) partition。kafka 分配的單位是 partition。
  •  consumer :從 kafka 集群中消費(fèi)消息的終端或服務(wù)。
  •  consumer group :high-level consumer API 中,每個(gè) consumer 都屬于一個(gè) consumer group,每條消息只能被 consumer group 中的一個(gè) Consumer 消費(fèi),但可以被多個(gè) consumer group 消費(fèi)。
  •  replica :partition 的副本,保障 partition 的高可用。
  •  leader :replica 中的一個(gè)角色, producer 和 consumer 只跟 leader 交互。
  •  follower :replica 中的一個(gè)角色,從 leader 中復(fù)制數(shù)據(jù)。
  •  controller :kafka 集群中的其中一個(gè)服務(wù)器,用來(lái)進(jìn)行 leader election 以及 各種 failover。
  •  zookeeper :kafka 通過(guò) zookeeper 來(lái)存儲(chǔ)集群的 meta 信息。

4. Kafka 基本特性

  1.  高吞吐量、低延遲 :kafka每秒可以處理幾十萬(wàn)條消息,它的延遲最低只有幾毫秒;
  2.  可擴(kuò)展性 :kafka集群支持熱擴(kuò)展;
  3.  持久性、可靠性 :消息被持久化到本地磁盤(pán),并且支持?jǐn)?shù)據(jù)備份防止數(shù)據(jù)丟失;
  4.  容錯(cuò)性 :允許集群中節(jié)點(diǎn)失敗(若副本數(shù)量為n,則允許n-1個(gè)節(jié)點(diǎn)失敗);
  5.  高并發(fā) :支持?jǐn)?shù)千個(gè)客戶(hù)端同時(shí)讀寫(xiě);

4.1. 設(shè)計(jì)思想

  •  consumergroup :各個(gè) consumer 可以組成一個(gè)組,每個(gè)消息只能被組中的一個(gè) consumer 消費(fèi),如果一個(gè)消息可以被多個(gè) consumer 消費(fèi)的話(huà),那么這些 consumer 必須在不同的組。
  •  消息狀態(tài) :在 Kafka 中,消息的狀態(tài)被保存在 consumer 中,broker 不會(huì)關(guān)心哪個(gè)消息被消費(fèi)了被誰(shuí)消費(fèi)了,只記錄一個(gè) offset 值(指向 partition 中下一個(gè)要被消費(fèi)的消息位置),這就意味著如果 consumer 處理不好的話(huà),broker 上的一個(gè)消息可能會(huì)被消費(fèi)多次。
  •  消息持久化 :Kafka 中會(huì)把消息持久化到本地文件系統(tǒng)中,并且保持極高的效率。
  •  消息有效期 :Kafka 會(huì)長(zhǎng)久保留其中的消息,以便 consumer 可以多次消費(fèi),當(dāng)然其中很多細(xì)節(jié)是可配置的。
  •  批量發(fā)送 :Kafka 支持以消息集合為單位進(jìn)行批量發(fā)送,以提高 push 效率。
  •  push-and-pull : Kafka 中的 Producer 和 consumer 采用的是 push-and-pull 模式,即 Producer 只管向 broker push 消息,consumer 只管從 broker pull 消息,兩者對(duì)消息的生產(chǎn)和消費(fèi)是異步的。Kafka集群中 broker 之間的關(guān)系:不是主從關(guān)系,各個(gè) broker 在集群中地位一樣,我們可以隨意的增加或刪除任何一個(gè) broker 節(jié)點(diǎn)。
  •  負(fù)載均衡方面 :Kafka 提供了一個(gè) metadata API 來(lái)管理 broker 之間的負(fù)載(對(duì) Kafka 0.8.x 而言,對(duì)于 0.7.x 主要靠 zookeeper 來(lái)實(shí)現(xiàn)負(fù)載均衡)。
  •  同步異步 :Producer 采用異步 push 方式,極大提高 Kafka 系統(tǒng)的吞吐率(可以通過(guò)參數(shù)控制是采用同步還是異步方式)。
  •  分區(qū)機(jī)制 partition :Kafka 的 broker 端支持消息分區(qū),Producer 可以決定把消息發(fā)到哪個(gè)分區(qū),在一個(gè)分區(qū)中消息的順序就是 Producer 發(fā)送消息的順序,一個(gè)主題中可以有多個(gè)分區(qū),具體分區(qū)的數(shù)量是可配置的。分區(qū)的意義很重大,后面的內(nèi)容會(huì)逐漸體現(xiàn)。
  •  離線(xiàn)數(shù)據(jù)裝載 :Kafka 由于對(duì)可拓展的數(shù)據(jù)持久化的支持,它也非常適合向 Hadoop 或者數(shù)據(jù)倉(cāng)庫(kù)中進(jìn)行數(shù)據(jù)裝載。
  •  插件支持 :現(xiàn)在不少活躍的社區(qū)已經(jīng)開(kāi)發(fā)出不少插件來(lái)拓展 Kafka 的功能,如用來(lái)配合 Storm、Hadoop、flume 相關(guān)的插件。

4.2. 應(yīng)用場(chǎng)景

  •  日志收集 :一個(gè)公司可以用Kafka可以收集各種服務(wù)的 log,通過(guò) kafka 以統(tǒng)一接口服務(wù)的方式開(kāi)放給各種 consumer,例如 hadoop、Hbase、Solr 等。
  •  消息系統(tǒng) :解耦和生產(chǎn)者和消費(fèi)者、緩存消息等。
  •  用戶(hù)活動(dòng)跟蹤 :Kafka 經(jīng)常被用來(lái)記錄 web 用戶(hù)或者 app 用戶(hù)的各種活動(dòng),如瀏覽網(wǎng)頁(yè)、搜索、點(diǎn)擊等活動(dòng),這些活動(dòng)信息被各個(gè)服務(wù)器發(fā)布到 kafka 的 topic 中,然后訂閱者通過(guò)訂閱這些 topic 來(lái)做實(shí)時(shí)的監(jiān)控分析,或者裝載到 hadoop、數(shù)據(jù)倉(cāng)庫(kù)中做離線(xiàn)分析和挖掘。
  •  運(yùn)營(yíng)指標(biāo) :Kafka 也經(jīng)常用來(lái)記錄運(yùn)營(yíng)監(jiān)控?cái)?shù)據(jù)。包括收集各種分布式應(yīng)用的數(shù)據(jù),生產(chǎn)各種操作的集中反饋,比如報(bào)警和報(bào)告。
  •  流式處理 :比如 spark streaming 和 storm

5. Push 模式 vs Pull 模式

5.1. 點(diǎn)對(duì)點(diǎn)模式

如上圖所示,點(diǎn)對(duì)點(diǎn)模式通常是基于拉取或者輪詢(xún)的消息傳送模型,這個(gè)模型的特點(diǎn)是發(fā)送到隊(duì)列的消息被一個(gè)且只有一個(gè)消費(fèi)者進(jìn)行處理。生產(chǎn)者將消息放入消息隊(duì)列后,由消費(fèi)者主動(dòng)的去拉取消息進(jìn)行消費(fèi)。點(diǎn)對(duì)點(diǎn)模型的的優(yōu)點(diǎn)是消費(fèi)者拉取消息的頻率可以由自己控制。但是消息隊(duì)列是否有消息需要消費(fèi),在消費(fèi)者端無(wú)法感知,所以在消費(fèi)者端需要額外的線(xiàn)程去監(jiān)控。

5.2. 發(fā)布訂閱模式

如上圖所示,發(fā)布訂閱模式是一個(gè)基于消息送的消息傳送模型,改模型可以有多種不同的訂閱者。生產(chǎn)者將消息放入消息隊(duì)列后,隊(duì)列會(huì)將消息推送給訂閱過(guò)該類(lèi)消息的消費(fèi)者(類(lèi)似微信公眾號(hào))。由于是消費(fèi)者被動(dòng)接收推送,所以無(wú)需感知消息隊(duì)列是否有待消費(fèi)的消息!但是 consumer1、consumer2、consumer3 由于機(jī)器性能不一樣,所以處理消息的能力也會(huì)不一樣,但消息隊(duì)列卻無(wú)法感知消費(fèi)者消費(fèi)的速度!所以推送的速度成了發(fā)布訂閱模模式的一個(gè)問(wèn)題!假設(shè)三個(gè)消費(fèi)者處理速度分別是 8M/s、5M/s、2M/s,如果隊(duì)列推送的速度為5M/s,則 consumer3 無(wú)法承受!如果隊(duì)列推送的速度為 2M/s,則 consumer1、consumer2 會(huì)出現(xiàn)資源的極大浪費(fèi)!

5.3. Kafka 的選擇

作為一個(gè)消息系統(tǒng), Kafka 遵循了傳統(tǒng)的方式,選擇由 Producer 向 broker push 消息并由 Consumer 從 broker pull 消息 。一些日志收集系統(tǒng) (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)消息。

對(duì)于 Kafka 而言,pull 模式更合適。pull 模式可簡(jiǎn)化 broker 的設(shè)計(jì),Consumer 可自主控制消費(fèi)消息的速率,同時(shí) Consumer 可以自己控制消費(fèi)方式——即可批量消費(fèi)也可逐條消費(fèi),同時(shí)還能選擇不同的提交方式從而實(shí)現(xiàn)不同的傳輸語(yǔ)義 。

6. Kafka 工作流程

6.1. 發(fā)送數(shù)據(jù)

我們看上面的架構(gòu)圖中,producer 就是生產(chǎn)者,是數(shù)據(jù)的入口。注意看圖中的紅色箭頭, Producer 在寫(xiě)入數(shù)據(jù)的時(shí)候永遠(yuǎn)的找 leader,不會(huì)直接將數(shù)據(jù)寫(xiě)入 follower !那 leader 怎么找呢?寫(xiě)入的流程又是什么樣的呢?我們看下圖:

  1.  先從集群獲取分區(qū)的 leader;
  2.  producer 將消息發(fā)送給 leader;
  3.  Leader 將消息寫(xiě)入本地文件;
  4.  followers 從l eader 拉取消息;
  5.  followers 將消息寫(xiě)入本地后向 leader 發(fā)送 ACK 確認(rèn);
  6.  leader 收到所有副本的 ACK 后向 producer 發(fā)送 ACK 確認(rèn);

6.1.1. 保證消息有序

需要注意的一點(diǎn)是,消息寫(xiě)入 leader 后,follower 是主動(dòng)的去 leader 進(jìn)行同步的!producer 采用 push 模式將數(shù)據(jù)發(fā)布到 broker,每條消息追加到分區(qū)中,順序?qū)懭氪疟P(pán),所以保證同一分區(qū)內(nèi)的數(shù)據(jù)是有序的 !寫(xiě)入示意圖如下:

6.1.2. 消息負(fù)載分區(qū)

上面說(shuō)到數(shù)據(jù)會(huì)寫(xiě)入到不同的分區(qū),那 kafka 為什么要做分區(qū)呢?相信大家應(yīng)該也能猜到,分區(qū)的主要目的是:

  •  方便擴(kuò)展 :因?yàn)橐粋€(gè) topic 可以有多個(gè) partition,所以我們可以通過(guò)擴(kuò)展機(jī)器去輕松的應(yīng)對(duì)日益增長(zhǎng)的數(shù)據(jù)量。
  •  提高并發(fā) :以 partition 為讀寫(xiě)單位,可以多個(gè)消費(fèi)者同時(shí)消費(fèi)數(shù)據(jù),提高了消息的處理效率。

熟悉負(fù)載均衡的朋友應(yīng)該知道,當(dāng)我們向某個(gè)服務(wù)器發(fā)送請(qǐng)求的時(shí)候,服務(wù)端可能會(huì)對(duì)請(qǐng)求做一個(gè)負(fù)載,將流量分發(fā)到不同的服務(wù)器,那在 kafka 中,如果某個(gè) topic 有多個(gè) partition,producer 又怎么知道該將數(shù)據(jù)發(fā)往哪個(gè) partition 呢?kafka 中有幾個(gè)原則:

  1.  partition 在寫(xiě)入的時(shí)候可以指定需要寫(xiě)入的 partition,如果有指定,則寫(xiě)入對(duì)應(yīng)的 partition;
  2.   如果沒(méi)有指定 partition,但是設(shè)置了數(shù)據(jù)的 key,則會(huì)根據(jù) key 的值 hash 出一個(gè) partition;
  3.  如果既沒(méi)指定 partition,又沒(méi)有設(shè)置 key,則會(huì)輪詢(xún)選出一個(gè) partition;

6.1.3. 保證消息不丟

保證消息不丟失是一個(gè)消息隊(duì)列中間件的基本保證,那 producer 在向 kafka 寫(xiě)入消息的時(shí)候, 怎么保證消息不丟失呢 ?其實(shí)上面的寫(xiě)入流程圖中有描述出來(lái), 那就是通過(guò) ACK 應(yīng)答機(jī)制!在生產(chǎn)者向隊(duì)列寫(xiě)入數(shù)據(jù)的時(shí)候可以設(shè)置參數(shù)來(lái)確定是否確認(rèn) kafka 接收到數(shù)據(jù),這個(gè)參數(shù)可設(shè)置的值為 0、1、all 。

    0 代表 producer 往集群發(fā)送數(shù)據(jù)不需要等到集群的返回,不確保消息發(fā)送成功。安全性最低但是效率最高。

    1 代表 producer 往集群發(fā)送數(shù)據(jù)只要 leader 應(yīng)答就可以發(fā)送下一條,只確保 leader 發(fā)送成功。

    all 代表 producer 往集群發(fā)送數(shù)據(jù)需要所有的 follower 都完成從 leader 的同步才會(huì)發(fā)送下一條,確保 leader 發(fā)送成功和所有的副本都完成備份。安全性最高,但是效率最低。

最后要注意的是,如果往不存在的 topic 寫(xiě)數(shù)據(jù),能不能寫(xiě)入成功呢?kafka 會(huì)自動(dòng)創(chuàng)建 topic,分區(qū)和副本的數(shù)量根據(jù)默認(rèn)配置都是 1。

6.2. 保存數(shù)據(jù)

Producer 將數(shù)據(jù)寫(xiě)入 kafka 后,集群就需要對(duì)數(shù)據(jù)進(jìn)行保存了!kafka 將數(shù)據(jù)保存在磁盤(pán),可能在我們的一般的認(rèn)知里,寫(xiě)入磁盤(pán)是比較耗時(shí)的操作,不適合這種高并發(fā)的組件。Kafka 初始會(huì)單獨(dú)開(kāi)辟一塊磁盤(pán)空間,順序?qū)懭霐?shù)據(jù)(效率比隨機(jī)寫(xiě)入高)。

6.2.1. Partition 結(jié)構(gòu)

前面說(shuō)過(guò)了每個(gè) topic 都可以分為一個(gè)或多個(gè) partition,如果你覺(jué)得 topic 比較抽象,那 partition 就是比較具體的東西了!Partition 在服務(wù)器上的表現(xiàn)形式就是一個(gè)一個(gè)的文件夾,每個(gè) partition 的文件夾下面會(huì)有多組 segment 文件,每組 segment 文件又包含 .index 文件、.log 文件、.timeindex 文件(早期版本中沒(méi)有)三個(gè)文件, log 文件就實(shí)際是存儲(chǔ) message 的地方,而 index 和 timeindex 文件為索引文件,用于檢索消息。

如上圖,這個(gè) partition 有三組 segment 文件,每個(gè) log 文件的大小是一樣的,但是存儲(chǔ)的 message 數(shù)量是不一定相等的(每條的 message 大小不一致)。文件的命名是以該 segment 最小 offset 來(lái)命名的,如 000.index 存儲(chǔ) offset 為 0~368795 的消息, kafka 就是利用分段+索引的方式來(lái)解決查找效率的問(wèn)題 。

6.2.2. Message結(jié)構(gòu)

上面說(shuō)到 log 文件就實(shí)際是存儲(chǔ) message 的地方,我們?cè)?producer 往 kafka 寫(xiě)入的也是一條一條的 message,那存儲(chǔ)在 log 中的 message 是什么樣子的呢?消息主要包含消息體、消息大小、offset、壓縮類(lèi)型...我們重點(diǎn)需要知道的是下面三個(gè):

  1.  offset :offset 是一個(gè)占 8byte 的有序 id 號(hào),它可以唯一確定每條消息在 parition 內(nèi)的位置;
  2.  消息大小 :消息大小占用 4byte,用于描述消息的大小;
  3.  消息體 :消息體存放的是實(shí)際的消息數(shù)據(jù)(被壓縮過(guò)),占用的空間根據(jù)具體的消息而不一樣。

6.2.3. 存儲(chǔ)策略

無(wú)論消息是否被消費(fèi),kafka 都會(huì)保存所有的消息。那對(duì)于舊數(shù)據(jù)有什么刪除策略呢?

  •  基于時(shí)間 ,默認(rèn)配置是 168 小時(shí)(7天);
  •  基于大小 ,默認(rèn)配置是 1073741824。

需要注意的是, kafka 讀取特定消息的時(shí)間復(fù)雜度是 O(1) O ( 1 ) ,所以這里刪除過(guò)期的文件并不會(huì)提高 kafka 的性能 !

6.3. 消費(fèi)數(shù)據(jù)

消息存儲(chǔ)在 log 文件后,消費(fèi)者就可以進(jìn)行消費(fèi)了。在講消息隊(duì)列通信的兩種模式的時(shí)候講到過(guò)點(diǎn)對(duì)點(diǎn)模式和發(fā)布訂閱模式。Kafka 采用的是發(fā)布訂閱模式,消費(fèi)者主動(dòng)的去 kafka 集群拉取消息,與 producer 相同的是,消費(fèi)者在拉取消息的時(shí)候也是找 leader 去拉取 。

多個(gè)消費(fèi)者可以組成一個(gè)消費(fèi)者組(consumer group),每個(gè)消費(fèi)者組都有一個(gè)組 id!同一個(gè)消費(fèi)組者的消費(fèi)者可以消費(fèi)同一 topic 下不同分區(qū)的數(shù)據(jù),但是不會(huì)組內(nèi)多個(gè)消費(fèi)者消費(fèi)同一分區(qū)的數(shù)據(jù)!我們看下圖:

圖示是消費(fèi)者組內(nèi)的消費(fèi)者小于 partition 數(shù)量的情況,所以會(huì)出現(xiàn)某個(gè)消費(fèi)者消費(fèi)多個(gè) partition 數(shù)據(jù)的情況,消費(fèi)的速度也就不及只處理一個(gè) partition 的消費(fèi)者的處理速度! 如果是消費(fèi)者組的消費(fèi)者多于 partition 的數(shù)量,那會(huì)不會(huì)出現(xiàn)多個(gè)消費(fèi)者消費(fèi)同一個(gè) partition 的數(shù)據(jù)呢 ?上面已經(jīng)提到過(guò)不會(huì)出現(xiàn)這種情況! 多出來(lái)的消費(fèi)者不消費(fèi)任何 partition 的數(shù)據(jù) 。 所以在實(shí)際的應(yīng)用中,建議消費(fèi)者組的 consumer 的數(shù)量與 partition 的數(shù)量一致 !

在保存數(shù)據(jù)的小節(jié)里面,我們聊到了 partition 劃分為多組 segment,每個(gè) segment 又包含 .log、.index、.timeindex 文件,存放的每條 message 包含 offset、消息大小、消息體……我們多次提到 segment 和 offset,查找消息的時(shí)候是怎么利用 segment+offset 配合查找的呢?假如現(xiàn)在需要查找一個(gè) offset 為 368801 的 message 是什么樣的過(guò)程呢?我們先看看下面的圖:

    1.  先找到 offset 的 368801 message 所在的 segment 文件(利用二分法查找),這里找到的就是在第二個(gè) segment 文件。

    2.  打開(kāi)找到的 segment 中的 .index 文件(也就是 368796.index 文件,該文件起始偏移量為 368796+1,我們要查找的 offset 為 368801 的 message 在該 index 內(nèi)的偏移量為 368796+5=368801,所以這里要查找的相對(duì) offset 為 5)。由于該文件采用的是稀疏索引的方式存儲(chǔ)著相對(duì) offset 及對(duì)應(yīng) message 物理偏移量的關(guān)系,所以直接找相對(duì) offset 為 5 的索引找不到,這里同樣利用二分法查找相對(duì) offset 小于或者等于指定的相對(duì) offset 的索引條目中最大的那個(gè)相對(duì) offset,所以找到的是相對(duì) offset為 4 的這個(gè)索引。

    3.  根據(jù)找到的相對(duì) offset 為 4 的索引確定 message 存儲(chǔ)的物理偏移位置為 256。打開(kāi)數(shù)據(jù)文件,從位置為 256 的那個(gè)地方開(kāi)始順序掃描直到找到 offset 為 368801 的那條 Message。

這套機(jī)制是建立在 offset 為有序的基礎(chǔ)上,利用 segment+有序offset+稀疏索引+二分查找+順序查找 等多種手段來(lái)高效的查找數(shù)據(jù)。至此,消費(fèi)者就能拿到需要處理的數(shù)據(jù)進(jìn)行處理了。那每個(gè)消費(fèi)者又是怎么記錄自己消費(fèi)的位置呢?在早期的版本中,消費(fèi)者將消費(fèi)到的 offset 維護(hù) zookeeper 中,consumer 每間隔一段時(shí)間上報(bào)一次,這里容易導(dǎo)致重復(fù)消費(fèi),且性能不好!在新的版本中消費(fèi)者消費(fèi)到的 offset 已經(jīng)直接維護(hù)在kafka 集群的 consumer_offsets 這個(gè) topic 中了。 

 

責(zé)任編輯:龐桂玉 來(lái)源: JAVA高級(jí)架構(gòu)
相關(guān)推薦

2013-01-05 02:11:39

工程師程序員

2020-07-24 09:44:03

安全駐場(chǎng)工程師網(wǎng)絡(luò)安全IT安全

2024-03-19 14:38:07

工程師管理經(jīng)驗(yàn)

2013-02-21 16:44:13

系統(tǒng)工程師的sed

2011-03-24 08:22:29

HTMLCSSJavaScript

2019-04-26 13:46:19

5G通信工程師

2015-03-12 14:29:13

程序員程序員學(xué)習(xí)之路程序員感想

2015-08-26 14:18:25

Web前端工程師價(jià)值

2018-11-20 20:30:27

DBA數(shù)據(jù)庫(kù)云時(shí)代

2021-02-25 11:42:23

大數(shù)據(jù)數(shù)據(jù)分析sQL

2013-06-20 10:24:32

2015-05-04 13:24:12

工程師OpenStack公有云

2015-09-30 10:25:03

前端工程師

2022-03-14 18:14:17

NetOps網(wǎng)絡(luò)

2015-07-02 13:32:22

黑客中國(guó)黑客

2019-03-05 09:57:08

php編程語(yǔ)言工程師

2022-09-14 18:23:11

工程師面試Java

2017-10-25 14:28:27

Java工程師火爆原因

2015-03-04 10:03:09

2009-04-10 13:35:38

吳亮《JavaScript
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日本在线视频1区| 91国产丝袜播放在线| 精品视频一二| 亚洲无人区一区| 欧美久久电影| 国产毛片久久久久| 亚洲美女网站| 中文字幕欧美国内| 成人啪啪18免费游戏链接| 国产精品论坛| 中文字幕日韩精品一区| 国产在线精品一区二区中文 | 国产一区二区三区天码| 欧美浪妇xxxx高跟鞋交| 免费成人午夜视频| 国产视频中文字幕在线观看| 99re成人精品视频| 成人精品一区二区三区电影黑人| 日本少妇久久久| 日韩亚洲一区在线| 亚洲精品久久在线| 激情五月俺来也| 理论不卡电影大全神| 国产精品福利在线播放| 欧美成人一区二区在线| www.五月天激情| 日本aⅴ精品一区二区三区 | 亚洲一区二区在线免费观看| 国产 日韩 欧美 精品| 蜜臀99久久精品久久久久久软件| 91国产美女视频| 国产黄色小视频网站| 欧美日韩播放| 亚洲成avwww人| 亚洲午夜激情影院| 欧美美女日韩| 五月天网站亚洲| 青青视频免费在线观看| 色老头视频在线观看| 久久久久久久综合狠狠综合| 国产伦精品一区二区三区照片| 又色又爽又黄无遮挡的免费视频| 性一交一乱一区二区洋洋av| 欧美人与性动交| 丝袜 亚洲 另类 欧美 重口| 日韩电影免费在线观看| 中文字幕精品久久| 最近中文字幕在线mv视频在线 | 欧美日韩亚洲综合一区二区三区激情在线| 国产男女无套免费网站| 理论片日本一区| 国产精品福利观看| 波多野结衣视频观看| 国产日韩欧美三级| 2025国产精品视频| 一级片中文字幕| 久久国产福利| 青青草原一区二区| 免费看一级视频| 久久久久久黄| 国产精品激情自拍| 97国产精品久久久| 国产综合成人久久大片91| 国产精品美女免费视频| 伊人精品一区二区三区| 美女视频免费一区| 91在线视频精品| 国产熟女一区二区三区五月婷| 国产一区美女在线| 97碰碰视频| 性一交一乱一精一晶| 国产91在线观看| 国产精品免费在线播放| 午夜国产在线视频| 国产午夜一区二区三区| 视频一区亚洲| 国产黄色在线免费观看| 亚洲一区二区av电影| 久久视频这里有精品| 惠美惠精品网| 欧美美女一区二区在线观看| 亚洲一区二区中文字幕在线观看| 日韩在线亚洲| 精品亚洲夜色av98在线观看| 日韩一区二区a片免费观看| 日韩欧美自拍| 欧美成人激情视频| 国产小视频在线免费观看 | 中文字幕一区二区在线观看视频 | 人妻精品久久久久中文| 久久在线播放| 国内自拍欧美激情| 亚洲熟妇av一区二区三区漫画| а√天堂8资源在线| 欧美日韩一区二区在线播放| 男人的天堂日韩| 超碰国产精品一区二页| 亚洲国产精品专区久久| 欧美另类z0zx974| 欧美三级在线| 国产精品久久久久久久久久尿| 国产人妖一区二区三区| 91免费观看视频在线| 亚洲午夜精品久久| 久草免费在线视频| 91精品国产一区二区三区蜜臀| 亚洲av成人精品一区二区三区| 国内黄色精品| 欧美精品www| 少妇又紧又色又爽又刺激视频| 国产一区中文字幕| 欧美一二三四五区| 欧美人与禽猛交乱配| 在线观看日韩一区| 中文字幕第3页| 婷婷亚洲最大| 国产xxx69麻豆国语对白| 国产精品探花视频| 国产日韩欧美精品在线| 国产 日韩 欧美在线| 在线不卡一区| 亚洲性视频网站| 国产无遮挡又黄又爽又色| 久久国产夜色精品鲁鲁99| 久久精品99久久| 亚洲wwwww| 欧美日韩在线播| 亚洲欧美视频在线播放| 亚洲91中文字幕无线码三区| 欧美一区二区三区图| 丰满大乳国产精品| 亚洲欧美国产三级| 福利视频999| 日韩啪啪电影网| 国产精品美女免费看| 精品成人一区二区三区免费视频| 亚洲国产日韩一区二区| 香蕉视频色在线观看| 免费一级欧美在线观看视频| 亚洲国产天堂久久综合| 久久精品99国产精| 国产精品一区二区黑丝| a级黄色片网站| 伦一区二区三区中文字幕v亚洲| 国产一区二区美女视频| 精品国产xxx| 久久夜色精品国产噜噜av| 免费无码毛片一区二三区| www.丝袜精品| 国内精品视频一区| 好吊色一区二区| 亚洲国产成人va在线观看天堂| 国产精品99精品无码视亚| 欧美精品大片| 亚洲最大成人免费视频| 天天色天天射天天综合网| 日韩一区二区三免费高清| 免费中文字幕在线| 国产成人99久久亚洲综合精品| 女人床在线观看| av成人app永久免费| 久久久久久欧美| 日本一区二区三区在线观看视频| 欧美日韩亚洲天堂| 97超碰在线资源| 日韩av在线发布| 亚洲欧美日产图| 亚洲男女网站| 欧美裸体男粗大视频在线观看| 性做久久久久久久| 天天色图综合网| 极品人妻videosss人妻| 久久91精品久久久久久秒播| 91视频成人免费| 成人资源在线播放| 浅井舞香一区二区| 欧美日韩在线看片| 日韩免费高清av| 国产精品xxxx喷水欧美| 久久精品夜色噜噜亚洲aⅴ| 国产原创精品在线| 亚洲欧美综合| 欧美成人蜜桃| 欧美区一区二区| 2025国产精品视频| 婷婷免费在线视频| 亚洲国产精品网站| 一区二区乱子伦在线播放| 亚洲乱码日产精品bd| 免费的av网站| 久久国产生活片100| 黄色一级片在线看| 三级电影一区| 国产精品大全| 2021av在线| 欧美成人艳星乳罩| www.久久久久久久| 一区二区三区日韩精品| 91精品人妻一区二区三区蜜桃欧美| 免费的成人av| 日韩中字在线观看| 四季av一区二区凹凸精品| 激情五月综合色婷婷一区二区| 欧美久久久网站| 欧美又大又粗又长| 在线观看电影av| 中文字幕日韩免费视频| 免费观看黄色av| 欧美精品 日韩| 97久久久久久久| 一区二区三区精品久久久| 国产又粗又猛又爽又黄av| 成人精品一区二区三区四区| 视色视频在线观看| 麻豆久久婷婷| 成人免费观看在线| 91成人国产| 天天好比中文综合网| 欧美国产极品| 国产厕所精品在线观看| 电影中文字幕一区二区| 国产精品吹潮在线观看| 日本在线影院| 亚州成人av在线| dj大片免费在线观看| 色爱av美腿丝袜综合粉嫩av| 日本大片在线观看| 亚洲国产精品电影在线观看| 国产wwwxxx| 欧美美女黄视频| 中文字幕一区二区在线视频| 怡红院在线播放| 精品久久香蕉国产线看观看gif| 欧美一区免费观看| 国产精品女主播在线观看| 人妻大战黑人白浆狂泄| 99久久精品99国产精品| caopor在线| 国产成人免费在线观看不卡| 国产福利精品一区二区三区| 免费高清在线一区| 日本在线一二三区| 男女男精品网站| 国产三级日本三级在线播放| 亚洲自拍另类| 漂亮人妻被中出中文字幕| 99视频精品| 精品少妇一区二区三区在线| 在线成人欧美| 你懂的av在线| 亚洲视频播放| 任你操这里只有精品| 久久亚洲风情| www.xxx亚洲| 蜜臀久久99精品久久久画质超高清 | www.欧美免费| 欧美一级二级三级区| 精品国产欧美成人夜夜嗨| 欧美极品视频| 久久成人18免费网站| av软件在线观看| 欧美黄色成人网| а√天堂8资源在线| 91chinesevideo永久地址| 日本免费一区二区三区四区| 国产精品99久久久久久久久久久久 | 久久久久久久香蕉网| 91九色porn在线资源| 日本高清不卡在线| 懂色aⅴ精品一区二区三区| 国产精品久久久久久久久久小说 | 毛片激情在线观看| 久久综合免费视频| av福利导福航大全在线| 欧美专区中文字幕| 国产人妖一区| 91入口在线观看| 日韩超碰人人爽人人做人人添| 青青草国产精品| 在线电影一区二区| 亚洲熟妇无码一区二区三区| 天堂一区二区在线免费观看| 国产亚洲视频一区| 成人精品亚洲人成在线| 亚洲理论片在线观看| 亚洲欧美日韩中文播放 | 污污内射在线观看一区二区少妇| 久久亚洲二区三区| 亚洲综合视频网站| 欧美特级www| 国产精品一级视频| 日韩电影在线观看永久视频免费网站| 福利片在线看| 欧美美女操人视频| 成人免费黄色| 国产精品久久亚洲7777| 日韩精品2区| 国产在线播放观看| 久久成人18免费观看| 亚洲一区二区三区综合| 国产精品毛片无遮挡高清| 国产在线拍揄自揄拍无码视频| 色94色欧美sute亚洲线路二 | 在线免费观看亚洲视频| 一本大道av一区二区在线播放 | 精品久久久久久久久久久久久久久 | 日本在线视频不卡| 黄色成人在线网站| 色一情一区二区| 91网站黄www| 久久久久97国产| 欧美日韩国产欧美日美国产精品| 少妇一区二区三区四区| 久久久精品国产网站| 日韩制服诱惑| 久久99精品国产一区二区三区| 亚洲国产精品久久久久蝴蝶传媒| 欧在线一二三四区| www.日韩精品| 麻豆亚洲av熟女国产一区二| 欧美日韩中文精品| 国产综合在线观看| 午夜精品久久久久久久久久久久久| 欧美视频第一| 日韩资源av在线| 亚洲一区久久| 亚洲图片综合网| 亚洲国产精品久久久久秋霞影院| 国产精品福利电影| 最近2019中文字幕一页二页| 成人免费看视频网站| 久久精精品视频| 国产日韩专区| 欧美成人三级伦在线观看| 亚洲午夜一区二区| 亚洲精品一区二区口爆| 欧美成人精品一区二区三区| 天堂久久一区| 在线观看一区二区三区三州 | 亚洲国产wwwccc36天堂| 国产成人精品白浆久久69| 精品国产拍在线观看| 色噜噜成人av在线| 亚洲欧洲精品一区| 免费看精品久久片| 亚洲一级理论片| 欧美日韩视频在线第一区 | 中文字幕乱码亚洲精品一区| 日本视频在线观看免费| 日韩大片免费观看视频播放| 成人三级高清视频在线看| 精品无人乱码一区二区三区的优势| 亚洲性感美女99在线| 中文字幕在线视频播放| 精品久久久久久亚洲国产300| 性xxxx视频播放免费| 97在线免费观看| 亚洲精品合集| 色综合手机在线| 国产精品高潮呻吟久久| aaaa一级片| 久久99亚洲热视| 女一区二区三区| 少妇高清精品毛片在线视频| 亚洲国产精品成人久久综合一区| 黄色一区二区视频| 超碰97人人做人人爱少妇| 哺乳挤奶一区二区三区免费看| 九九热只有这里有精品| 久久综合狠狠综合久久综合88 | 欧美黄色视屏| 国模精品娜娜一二三区| 久久一二三四| 69夜色精品国产69乱| 日韩精品一区二区三区中文精品| 国产盗摄一区二区| 日本黄网免费一区二区精品| 久久精品国内一区二区三区| 可以直接看的黄色网址| 亚洲激情视频网站| www.一区| 精品人妻人人做人人爽| 久久天堂av综合合色蜜桃网| 一级做a爱片久久毛片| 欧美精品videofree1080p| 欧美日韩高清| 欧美xxxx黑人| 色8久久人人97超碰香蕉987| 国产在线观看a视频| 久久av一区二区三区漫画| 九色porny丨国产精品| 日产精品久久久久| 色妞久久福利网| 日本成人中文| 免费人成视频在线播放| 日本道精品一区二区三区| 日本精品600av| 日韩中文字幕一区| www.欧美.com| 国产99久久九九精品无码免费|