java - 持续的消费者群体重新平衡,消费者多于分区

标签 java apache-kafka kafka-consumer-api

给定以下设置:

  • 卡夫卡 v0.11.0.0
  • 3 名经纪人
  • 2 个主题,每个主题有 2 个分区,复制因子为 3
  • 2 个消费者组,每个主题一个
  • 3 个包含消费者的服务器

服务器包含两个消费者,每个主题一个:

  • 服务器A
    • consumer-A1 in group topic-1-group consuming topic-1
    • consumer-A2 in group topic-2-group consuming topic-2
  • 服务器 B
    • consumer-B1 in group topic-1-group consuming topic-1
    • consumer-B2 in group topic-2-group consuming topic-2
  • 服务器 C
    • consumer-C1 in group topic-1-group consuming topic-1
    • consumer-C2 in group topic-2-group consuming topic-2

在这种情况下,当我们检查组 topic-1-group 的 kafka-consumer-groups.bat 输出时,我们看到以下内容:

  • consumer-B1 分配给topic-1 partition-1
  • consumer-C1 分配给 topic-1 partition-0
  • consumer-A1 未分配给任何分区

这似乎符合我们的预期。由于分区数为 2,因此我们只有两个活跃的消费者。第三个消费者只是闲置。我们能够很好地使用主题中的消息。

接下来,我们关闭服务器 B(主动分配给一个分区)。这样做,我们预计 topic-1-group 会进入再平衡,并预计 consumer-A1 将取代 consumer-B1 并被分配到一个分区,从而满足以下条件:

  • consumer-A1 分配给 topic-1 partition-1
  • consumer-C1 分配给 topic-1 partition-0
  • consumer-B1 没有分配给任何东西,因为它不再活跃

不过,我们看到的是消费者组 topic-1-group 进入了一种似乎不会停止的再平衡状态。心跳似乎也失败了,因为该组正在重新平衡。

从中恢复的唯一方法是关闭另一台服务器,以便主题 1 组只有一个消费者。当只有一个消费者时,我们能够成功接收该主题的消息。接下来,如果我们启动另外两个服务器,我们将继续成功接收该主题的消息。

问题

  • 这是一个有效的使用场景吗?
  • 在这种情况下会发生什么?
  • 消费者会不会有问题? (在配置方面,除了设置主题、消费者组等基础知识外,我们对所有内容都使用默认值...我们使用 KafkaConsumer.subscribe(Collection) 而不是手动分配分区)
  • 经纪人/Zookeeper 会不会有问题?

最佳答案

(我将作为答案发布,因为我不够酷,无法发表评论。这可能是“答案”,尽管不令人满意:不支持比分区更多的消费者配置)。

根据kafka文档: https://kafka.apache.org/documentation.html#introduction 通过在主题中使用并行概念(分区),Kafka 能够在消费者进程池中提供顺序保证和负载平衡。这是通过将主题中的分区分配给消费者组中的消费者来实现的,以便每个分区仅由组中的一个消费者消费。通过这样做,我们确保消费者是该分区的唯一读者并按顺序消费数据。由于有很多分区,这仍然可以平衡许多消费者实例的负载。但是请注意,消费者组中的消费者实例不能多于分区。

虽然在实践中,额外的消费者会一直闲置,直到活跃的消费者离开,但它似乎有时会进入一种永久重新平衡的状态。

这个 stackoverflow 线程 ( In Apache Kafka why can't there be more consumer instances than partitions? ) 讨论了这个问题,并讨论了为什么您希望消费者比分区少,但没有说明当您拥有更多消费者时会发生什么。其中一条有趣的评论给出了您可能想要配置更多(用于故障转移)但没有回复的原因: 现在我们还想确保即使某些消费者实例失败,我们仍然为每个消费者实例提供一个分区。这样做的合乎逻辑的方法是向组中添加更多的消费者;虽然一切正常,但他们不会做任何事情,但当某些消费者失败时,其中一个会收到该分区。为什么不允许这样做?

关于java - 持续的消费者群体重新平衡,消费者多于分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46863523/

相关文章:

c# - 在 C# 中加密的数据是 1 个字节太长,无法在 Java 中解密

apache-kafka - 如何在kafka中创建一个新的消费者组

apache-kafka - 如何让 Kafka 消费者订阅新分区

c - RDKafka 客户端无法访问 Kafka 代理

java - JPA : removing from a collection 中管理双向关系时出现问题

java - 带递归的Codewars Persistence方法?

c# - 使用 Java 解密由 .NET 的 RijndaelManaged 加密的字节

apache-kafka - 我应该如何将clickhouse连接到Kafka?

apache-kafka - Kafka多节点集群监控

java - 了解创建的 StreamProcessor 实例数以及流任务是否共享同一个流处理器实例?