Kafka Consumer max.poll.records 与多个分区

问题描述 投票:0回答:1

想要了解具有多个分区的 Kafka 主题的 max.poll.records 的行为。 假设我在一个消费者组中有 8 个分区和 8 个消费者实例。假设生产者以非常快的速度生成 2000 条消息。假设使用循环分区器。并且消息大小非常小(即忽略 fetch.max.bytes)

  1. 理想情况下,8个分区各写入250条消息吗?
  2. 如果消费者级别的 max.poll.records 为默认值 - 500 - 那么每个消费者实例是否会一次提取所有 250 条记录?
  3. 消费者实例1会收到消息1、9、17、25等吗?

需要纯粹从理论上理解——实际上还有很多其他变量。

apache-kafka kafka-consumer-api
1个回答
0
投票

快速回答 - 对您的所有问题都是肯定的。我将详细解释您的情况,以便证明“是”是合理的。在你的例子中:

  • 有一个 Topic
    T1
    ,有 8 个分区。
  • 8个消费者组成的消费组从主题中读取 -> 每个消费者 被分配 1 个分区
  • 消息数量:2000(m1,m2,m3,....,m2000)
  • 循环分区器

假设消息几乎立即生成(在消费任何消息之前,该表显示了消息在 kafka 主题中的分布情况 - 每个分区有 250 条消息(point1)。

Topic   | Partition | Messages
T1      |   P1      |   m1, m9,  m17, ..., m1993
T1      |   P2      |   m2, m10, m18, ..., m1994
T1      |   P3      |   m3, m11, m19, ..., m1995
T1      |   P4      |   m4, m12, m20, ..., m1996
T1      |   P5      |   m5, m13, m21, ..., m1997
T1      |   P6      |   m6, m14, m22, ..., m1998
T1      |   P7      |   m7, m15, m23, ..., m1999
T1      |   P8      |   m8, m16, m24, ..., m2000

由于消费者组的每个消费者只分配一个分区,因此它最多会读取 500 条记录,就像你提到的那样。然而,由于只有 250 条可用,消费者读取了 250 条记录/消息(point2)(假设:没有其他设置可以限制 kafka 消费者读取的消息数量,并且在初始写入后不再写入更多消息)

无法保证哪个消费者实例分配了哪个分区,但无论哪个消费者实例分配了partition1,都将读取消息m1,m9,m17,...,m1993(point3

© www.soinside.com 2019 - 2024. All rights reserved.