1. 程式人生 > >Kafka工作流程-消費過程分析

Kafka工作流程-消費過程分析

    kafka提供了兩套consumer API:高階Consumer API和低階API。

1.消費模型

       訊息由生產者釋出到Kafka集群后,會被消費者消費。訊息的消費模型有兩種:推送模型(push)和拉取模型(pull)。

     基於推送模型(push)的訊息系統,由訊息代理記錄消費者的消費狀態。訊息代理在將訊息推送到消費者後,標記這條訊息為已消費,但這種方式無法很好地保證訊息被處理。比如,訊息代理把訊息傳送出去後,當消費程序掛掉或者由於網路原因沒有收到這條訊息時,就有可能造成訊息丟失(因為訊息代理已經把這條訊息標記為已消費了,但實際上這條訊息並沒有被實際處理)。如果要保證訊息被處理,訊息代理髮送完訊息後,要設定狀態為“已傳送”,只有收到消費者的確認請求後才更新為“已消費”,這就需要訊息代理中記錄所有的消費狀態,這種做法顯然是不可取的。

     Kafka採用拉取模型,由消費者自己記錄消費狀態,每個消費者互相獨立地順序讀取每個分割槽的訊息。如下圖所示,有兩個消費者(不同消費者組)拉取同一個主題的訊息,消費者A的消費進度是3,消費者B的消費進度是6。消費者拉取的最大上限通過最高水位(watermark)控制,生產者最新寫入的訊息如果還沒有達到備份數量,對消費者是不可見的。這種由消費者控制偏移量的優點是:消費者可以按照任意的順序消費訊息。比如,消費者可以重置到舊的偏移量,重新處理之前已經消費過的訊息;或者直接跳到最近的位置,從當前的時刻開始消費。

       在一些訊息系統中,訊息代理會在訊息被消費之後立即刪除訊息。如果有不同型別的消費者訂閱同一個主題,訊息代理可能需要冗餘地儲存同一訊息;或者等所有消費者都消費完才刪除,這就需要訊息代理跟蹤每個消費者的消費狀態,這種設計很大程度上限制了訊息系統的整體吞吐量和處理延遲。Kafka的做法是生產者釋出的所有訊息會一致儲存在Kafka叢集中,不管訊息有沒有被消費。使用者可以通過設定保留時間來清理過期的資料,比如,設定保留策略為兩天。那麼,在訊息釋出之後,它可以被不同的消費者消費,在兩天之後,過期的訊息就會自動清理掉。

2.高階API

(1) 高階API優點

    高階API 寫起來簡單

    不需要自行去管理offset,系統通過zookeeper自行管理。

    不需要管理分割槽,副本等情況,系統自動管理。

    消費者斷線會自動根據上一次記錄在zookeeper中的offset去接著獲取資料(預設設定1分鐘更新一下zookeeper中存的offset)。

    可以使用group來區分對同一個topic 的不同程式訪問分離開來(不同的group記錄不同的offset,這樣不同程式讀取同一個topic才不會因為offset互相影響)。

(2) 高階API缺點

    不能自行控制offset(對於某些特殊需求來說)

    不能細化控制如分割槽、副本、zk等

3.低階API

(1) 低階 API 優點

    能夠讓開發者自己控制offset,想從哪裡讀取就從哪裡讀取。

    自行控制連線分割槽,對分割槽自定義進行負載均衡

    對zookeeper的依賴性降低(如:offset不一定非要靠zk儲存,自行儲存offset即可,比如存在檔案或者記憶體中)

(2) 低階API缺點

    太過複雜,需要自行控制offset,連線哪個分割槽,找到分割槽leader 等。

4.消費者組

    消費者是以consumer group消費者組的方式工作,由一個或者多個消費者組成一個組,共同消費一個topic。每個分割槽在同一時間只能由group中的一個消費者讀取,但是多個group可以同時消費這個partition。如上圖所示,有一個由三個消費者組成的group,有一個消費者讀取主題中的兩個分割槽,另外兩個分別讀取一個分割槽。某個消費者讀取某個分割槽,也可以叫做某個消費者是某個分割槽的擁有者。

    在這種情況下,消費者可以通過水平擴充套件的方式同時讀取大量的訊息。另外,如果一個消費者失敗了,那麼其他的group成員會自動負載均衡讀取之前失敗的消費者讀取的分割槽。

5.消費方式

    consumer採用pull(拉)模式從broker中讀取資料。

    push(推)模式很難適應消費速率不同的消費者,因為訊息傳送速率是由broker決定的。它的目標是儘可能以最快速度傳遞訊息,但是這樣很容易造成consumer來不及處理訊息,典型的表現就是拒絕服務以及網路擁塞。而pull模式則可以根據consumer的消費能力以適當的速率消費訊息。

    對於Kafka而言,pull模式更合適,它可簡化broker的設計,consumer可自主控制消費訊息的速率,同時consumer可以自己控制消費方式——即可批量消費也可逐條消費,同時還能選擇不同的提交方式從而實現不同的傳輸語義。

    pull模式不足之處是,如果kafka沒有資料,消費者可能會陷入迴圈中,一直等待資料到達。為了避免這種情況,我們在我們的拉請求中有引數,允許消費者請求在等待資料到達的“長輪詢”中進行阻塞(並且可選地等待到給定的位元組數,以確保大的傳輸大小)。

6.消費者組案例

(1) 需求

測試同一個消費者組中的消費者,同一時刻只能有一個消費者消費。

(2) 案例實操

    ① 在hadoop102、hadoop103上修改/opt/module/kafka/config/consumer.properties配置檔案中的group.id屬性為任意組名。

        [[email protected] config]$ vi consumer.properties

        group.id=luomk

    ② 在hadoop102、hadoop103上分別啟動消費者

        [[email protected] kafka]$ bin/kafka-console-consumer.sh -zookeeper hadoop102:2181 --topic first --consumer.config config/consumer.properties

        [[email protected] kafka]$ bin/kafka-console-consumer.sh -zookeeper hadoop102:2181 --topic first --consumer.config config/consumer.properties

    ③ 在hadoop104上啟動生產者

        [[email protected] kafka]$ bin/kafka-console-producer.sh --broker-list hadoop102:9092 --topic first

        >hello world

    ④ 檢視hadoop102和hadoop103的接收者。

        同一時刻只有一個消費者接收到訊息。

相關推薦

Kafka工作流程-消費過程分析

    kafka提供了兩套consumer API:高階Consumer API和低階API。 1.消費模型        訊息由生產者釋出到Kafka集群后,會被消費者消費。訊息的消費模型有兩種:推送模型(push)和拉取模型(pull)。      基於推送模

Kafka工作流程分析

一.Kafka生產過程分析 1.寫入方式 producer採用push模式將訊息傳送到broker,每條訊息都被追加(append)到分割槽中,屬於順序寫磁碟(順序寫磁碟效率要比隨機寫記憶體要高,保障Kafka吞吐率)。 2.分割槽 訊息傳送時都被髮送到一個topic,其本質就是個目

Kafka工作流程-儲存訊息

1.儲存方式     物理上把topic分成一個或多個patition(對應 server.properties 中的num.partitions=3配置),每個patition物理上對應一個資料夾(該資料夾儲存該patition的所有訊息和索引檔案),如下: [[ema

Kafka工作流程-Kafka 消費者

1. 使用消費者組實現訊息佇列的兩種模式     Kafka 叢集的資料需要被不同型別的消費者使用,而不同型別的消費者處理邏輯不 同。Kafka 使用消費組的概念,允許一組消費者程序對消費工作進行劃分。每個消費者都可 以配置一個所屬的消費組,並且訂閱多個主題。Kafka 會

Kafka工作流程-KafkaCluster和Kafka 高可靠性儲存

1.KafkaCluster     在使用 Kafka 低階消費者時,可以通過 KafkaCluster 類實現 offset 向 ZooKeeper 的提交 和獲取。     Kafka 協議非常簡單,只有六個核心客戶端請求 API:         元資料(Met

SpringMVC工作流程及程式碼分析

  每談到SpringMVC的工作流程,首先接觸到的就是下面這個圖。從這個圖可以大致明白SpringMVC是如何工作的。但是我是一個喜歡探究來龍去脈的人,如果不告訴我為什麼這麼做,單單知道流程就是這樣,抱歉,我真的記不住,更不用提裡面這麼多專業名詞了。所以,通過翻閱了原始碼,大致知道流程是具體怎麼實現的,也學

Dubbo學習筆記10:Dubbo服務消費方啟動流程源碼分析

exec checked 自己 當前 In rpc mod png collect 同理我們看下服務消費端啟動流程時序圖: 在《Dubbo整體架構分析》一文中,我們提到服務消費方需要使用ReferenceConfig API來消費服務,具體是調用代碼(1)get()方法來

三大框架(ssh)學習——Struts2工作流程分析

Struts2工作流程分析   STRUTS2框架內部流程 1. 客戶端傳送請求的tomcat伺服器。伺服器接受,將HttpServletRequest傳進來。 2. 請求經過一系列過濾器(如:ActionContextCleanUp、SimeMesh等) 3. Fil

kafka叢集Producer基本資料結構及工作流程深入剖析-kafka 商業環境實戰

本套技術專欄是作者(秦凱新)平時工作的總結和昇華,通過從真實商業環境抽取案例進行總結和分享,並給出商業應用的調優建議和叢集環境容量規劃等內容,請持續關注本套部落格。期待加入IOT時代最具戰鬥力的團隊。QQ郵箱地址:[email protected],如有任何學術交流,可隨時聯絡

Kafka:無丟失提取kafka的值,詳解kafka消費過程

目錄: 1、需求 2、程式碼步鄹 3、程式碼展現 4、pom.xml檔案 5、結果展現 ——————————————————————————————————– 1、需求 前提:將org.apache.spark.streaming.kafka.KafkaCluster這個類抽出來變成Kafka

大資料之storm(一) --- storm簡介,核心元件,工作流程,安裝和部署,電話通訊案例分析,叢集執行,單詞統計案例分析,調整併發度

一、storm簡介 --------------------------------------------------------- 1.開源,分散式,實時計算 2.實時可靠的處理無限資料流,可以使用任何語言開發 3.適用於實時分析,線上機器學習

Libevent原始碼分析-----Libevent工作流程探究

        之前的博文講了很多Libevent的基礎構件,現在以一個實際例子來初步探究Libevent的基本工作流程。由於還有很多Libevent的細節並沒有講所以,這裡的探究還是比較簡潔,例子也相當簡單。 #include<unistd.h> #in

Phone 通話過程中 PSensor 工作流程--

概要        在Android手機通話過程中,使用者將手機靠近/遠離頭部,會導致手機螢幕滅/亮,這實際上是Proximity Sensor在起作用(參考1)。通俗的來講Proximity Sensor就是近距離感測器,後文簡寫為PSensor,近距離

Phone 通話過程中 PSensor 工作流程--不全

概要        在Android手機通話過程中,使用者將手機靠近/遠離頭部,會導致手機螢幕滅/亮,這實際上是Proximity Sensor在起作用(參考1)。通俗的來講Proximity Sensor就是近距離感測

Dubbo消費端呼叫服務端過程分析

呼叫鏈的整體流程圖 下面藍色部分是消費端的呼叫過程,大致過程分為Proxy–>Filter–>Invoker–>Directory–>LoadBalance–>Filter

Open vSwitch(OvS)原始碼分析工作流程(flow流表查詢)

前面分析了Open vSwitch幾部分原始碼,對於Open vSwitch也有了個大概的理解,今天要分析的程式碼將是整個Open vSwitch的重中之重。整個Open vSwitch的核心程式碼在datapath檔案中;而datapath檔案中的核心程式碼又在ovs_dp_process_re

【Spring啟動過程分析】(1)啟動流程簡介

1、 spring簡介 spring的最基本的功能就是建立物件及管理這些物件之間的依賴關係,實現低耦合、高內聚。還提供像通用日誌記錄、效能統計、安全控制、異常處理等面向切面的能力,還能幫我們管理最頭疼的資料庫事務,本身提供了一套簡單的JDBC訪問實現,提供與 第三方資料訪問

專題4-我是bootloader設計師-uboot工作流程分析+G-boot構架設計

一、uboot工作流程分析 1、程式的入口 首先在uboot的Makefile中檢視關鍵詞“smdk2440”,在board/samsung(board代表開發板支援)中有個smdk2440的資料夾,裡面有連結器指令碼u-boot.lds,在u-boot.l

storm原始碼分析之acker工作流程

我們知道storm一個很重要的特性是它能夠保證你發出的每條訊息都會被完整處理,完整處理的意思是指: 一個tuple以及這個tuple所導致的所有的tuple都會被成功處理。而一個tuple會被認為處理失敗瞭如果這個訊息在timeout所指定的時間內沒有成功處理。 也就是說對

ARM的異常處理過程分析(異常向量/工作模式)

ARM的7種工作模式:         1、使用者模式(Usr):用於正常執行程式;         2、快速中斷模式(FIQ):用於高速資料傳輸;         3、外部中斷模式(IRQ):用於通常的中斷處理;         4、管理模式(svc):作業系統使用的保