gpt4 book ai didi

apache-kafka - Kafka消费者订阅多个主题时接收消息的顺序

转载 作者:行者123 更新时间:2023-12-03 23:53:45 27 4
gpt4 key购买 nike

我有一个调查多个主题的消费者。对于这个问题,我限制了每个主题一个分区。假设当消费者开始轮询时,每个主题都有一些数据。
读取顺序是什么?

是循环赛吗?它是从第一个在下一个之前读取的吗?我用 consumer.poll(N)进行投票。

最佳答案

排序比较复杂。这是 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从那个扁平的大队列
  • 在记录返回给 poll 的调用者之前,开始对所有节点的另一个 fetch 请求,但这一次,所有已经在扁平化队列中的主题分区都被排除在外
  • 这适用于所有 future poll来电

  • 在实践中,这意味着您不会挨饿,但您可能会收到来自一个主题的大量消息,然后才能获得下一个主题的大量消息。
    在消息大小为 10 字节的测试中,从一个主题读取了大约 58000 条消息,然后从下一个主题读取了大致相同的数量。
    所有主题都预先填充了 100 万条消息。
    因此,您将有一种批量循环。

    关于apache-kafka - Kafka消费者订阅多个主题时接收消息的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53149012/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com