簡體   English   中英

Kafka 消費者訂閱多個主題時接收消息的順序

[英]Order of receiving messages if Kafka consumer subscribes to multiple topics

我有一個消費者調查多個主題。 對於這個問題,我限制了每個主題一個分區。 假設當消費者開始輪詢時,每個主題都有一些數據。 讀取順序是什么?

是循環嗎? 是從第一個讀到下一個嗎? 我使用consumer.poll(N)進行輪詢。

沒有排序,因為底層協議允許在一個請求中發送多個分區的請求。

當您調用consumer.poll(N) ,客戶端確實將FetchRequest對象發送到托管分區領導者的代理(請參閱org.apache.kafka.clients.consumer.internals.Fetcher.createFetchRequests() ) - 每個節點只有一個請求,不是每個分區。

重要的是客戶端可以為多個分區發送一個 FetchRequest(參見 協議規范)。

排序比較復雜。 以下是 Kafka 2.6 的工作原理:

  • 當您將主題分區分配給消費者時,它們將保存在哈希表中,因此順序將是穩定的,但不一定是您使用的順序
  • 當您調用Consumer.poll(N)它返回所有排隊的消息,但最多為max.poll.records (見下文)
  • 當沒有任何內容排隊時,您分配的所有主題分區都會按每個 Kafka 節點進行分區,該主題分區的領導者所在的位置
  • 這些列表中的每一個都在獲取請求中發送到每個相應的節點
  • 每個節點最多返回fetch.max.bytes (或至少一條消息,如果可用)
  • 節點將用來自請求分區的消息填充這些字節,始終從第一個開始
  • 如果當前分區中沒有更多消息,但仍有字節要填充,它將移動到下一個分區,直到沒有更多消息或緩沖區已滿
  • 節點也可以決定停止使用當前分區並繼續下一個分區,即使當前分區中仍有可用消息
  • 客戶端/消費者收到緩沖區后,將其拆分為CompletedFetches ,其中一個CompletedFetch包含緩沖區中一個主題分區的所有消息
  • 那些CompletedFetches入隊(它們可能包含 0 條消息或 1000 條或更多)。 每個請求的主題分區都會有一個CompletedFetch
  • 由於對節點的所有請求都是並行運行的,但只有一個隊列,因此與原始分配順序相反, CompletedFetches /topic 分區可能會在最終結果中混淆
  • 入隊的CompletedFetches在邏輯上被壓縮成一個大隊列
  • Consumer.poll(N)將從扁平化的大隊列中讀取最多max.poll.records從隊列中max.poll.records
  • 在記錄返回給poll的調用者之前,另一個對所有節點的 fetch 請求被啟動,但這一次,已經在扁平隊列中的所有主題分區都被排除在外
  • 這適用於所有未來的poll

在實踐中,這意味着您不會餓死,但您可能會收到來自一個主題的大量消息,然后才會收到下一個主題的大量消息。

在消息大小為 10 字節的測試中,從一個主題讀取了大約 58000 條消息,然后從下一個主題讀取了大致相同的數量。 所有主題都預先填充了 100 萬條消息。

因此,您將擁有一種批處理循環。

暫無
暫無

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

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