簡體   English   中英

Kafka消費者如何從多個分配的分區中消費

[英]How does Kafka Consumer Consume from Multiple assigned Partition

TL;博士; 我試圖了解分配了多個分區的單個使用者如何處理消耗分區的記錄。

例如:

  • 在移動到下一個分區之前完全處理單個分區。
  • 每次處理每個分區的一大塊可用記錄。
  • 從第一個可用分區處理一批N條記錄
  • 在循環輪換中處理來自分區的一批N條記錄

我發現partition.assignment.strategy配置RangedRoundRobin轉讓但這只是決定消費者是如何分配的分區,它從它被分配到分區而不是如何消耗。

我開始深入研究KafkaConsumer源代碼,然后#poll()引導我進入#pollForFetches() #pixForFetches()然后引導我到fetcher#fetchedRecords()fetcher#sendFetches()

這只是讓我嘗試一起跟隨整個Fetcher課程 ,也許它只是遲到或者我只是沒有深入挖掘但我無法解決消費者將如何處理多個指定的分區。

背景

處理由Kafka Streams支持的數據管道。

在此管道中的幾個階段,由於記錄由不同的Kafka Streams應用程序處理,因此流將連接到由外部數據源提供的壓縮主題,外部數據源提供將在繼續進入下一階段處理之前在記錄中擴充的所需數據。

在此過程中,有幾個死信主題,其中記錄無法與可能增加記錄的外部數據源匹配。 這可能是因為數據尚未可用(事件或廣告系列尚未投放),或者它是錯誤數據且永遠不會匹配。

目標是在發布新的增強數據時重新發布死信主題中的記錄,以便我們可以匹配死信主題中以前不匹配的記錄,以便更新它們並將它們發送到下游以進行其他處理。

記錄可能無法在多次嘗試中匹配,並且可能在死信主題中有多個副本,因此我們只想重新處理現有記錄(在應用程序啟動時的最新偏移之前)以及發送到死信主題的記錄自上次運行應用程序以來(在先前保存的消費者組偏移之后)。

它很好用,因為我的消費者過濾掉了應用程序啟動后到達的任何記錄,我的生產者通過提交偏移作為發布交易的一部分來管理我的消費者群體抵消。

但是我想確保我最終將從所有分區中消耗,因為我遇到了一個奇怪的邊緣情況,其中未匹配的記錄被重新處理並落入與死信主題中相同的分區,僅被消費者過濾掉。 雖然沒有獲得新批次的記錄,但是還有一些分區還沒有被重新處理。

任何幫助了解單個消費者如何處理多個分配的分區將不勝感激。

由於大多數邏輯存在,你在正確的軌道上看着Fetcher

首先, 消費者Javadoc提到:

如果為消費者分配了多個分區來從中獲取數據,它將嘗試同時使用所有這些分區,從而有效地為這些分區提供相同的優先級以供消費。

可以想象,在實踐中,有一些事情需要考慮。

  • 消費者每次嘗試獲取新記錄時,都會排除已經有記錄等待的分區(來自之前的提取)。 已排除已在傳輸中獲取請求的分區也將被排除在外。

  • 在獲取記錄時,使用者在獲取請求中指定fetch.max.bytesmax.partition.fetch.bytes 經紀人使用這些來分別確定總共和每個分區要返回的數據量。 這同樣適用於所有分區。

使用這兩種方法,默認情況下,Consumer會嘗試公平地使用所有分區。 如果不是這種情況,更改fetch.max.bytesmax.partition.fetch.bytes通常會max.partition.fetch.bytes幫助。

如果您希望將某些分區優先於其他分區,則需要使用pause()resume()來手動控制消耗流。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM