天天看點

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

Kafka 消費過程分析

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

3.3.1 進階 API

1)進階 API 優點

進階 API 寫起來簡單

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

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

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

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

2)進階 API 缺點

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

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

3.3.2 低級 API

1)低級 API 優點

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

自行控制連接配接分區,對分區自定義進行負載均衡

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

2)低級 API 缺點

太過複雜,需要自行控制 offset,連接配接哪個分區,找到分區 leader 等。

3.3.3 消費者組

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

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

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

為什麼每個分區隻能組的一個消費者讀取,考慮到多線程下的鎖問題

3.3.4 消費方式

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

push(推)模式很難适應消費速率不同的消費者,因為消息發送速率是由 broker 決定的。它的目标是盡可能以最快速度傳遞消息,但是這樣很容易造成 consumer 來不及處理消息,典型的表現就是拒絕服務以及網絡擁塞。

而 pull 模式則可以根據 consumer 的消費能力以适當的速率消費消息。

對于 Kafka 而言,pull 模式更合适,它可簡化 broker 的設計,consumer 可自主要制消費消息的速率,同時 consumer 可以自己控制消費方式——即可批量消費也可逐條消費,同時還能選擇不同的送出方式進而實作不同的傳輸語義。

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

3.3.5 消費者組案例

1)需求:測試同一個消費者組中的消費者,同一時刻隻能有一個消費者消費。

2)案例實操

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

vi consumer.properties

group.id=atguigu

(2)在 hadoop102、hadoop103 上分别啟動消費者

bin/kafka-console-consumer.sh --zookeeper hadoop102:2181 --topic first --consumer.config config/consumer.properties

bin/kafka-console-consumer.sh --zookeeper hadoop102:2181 --topic first --consumer.config config/consumer.properties

(3)在 hadoop104 上啟動生産者

bin/kafka-console-producer.sh --broker-list hadoop102:9092 --topic first

>hello world

(4)檢視 hadoop102 和 hadoop103 的接收者。

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