[英]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.