[英]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
(見下文)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.