Kafka 消费者群体突然停止在实例之间平衡消息

Kafka consumer groups suddenly stopped balancing messages among instances

我们有一个由 Kafka 在 Confluent 上通信的微服务架构,其中每个服务都设置在自己的消费者组中,以平衡多个实例之间的消息传递。

例如:

SERVICE_A_INSTANCE_1 (CONSUMER_GROUP_A)
SERVICE_A_INSTANCE_2 (CONSUMER_GROUP_A)
SERVICE_A_INSTANCE_3 (CONSUMER_GROUP_A)

SERVICE_B_INSTANCE_1 (CONSUMER_GROUP_B)
SERVICE_B_INSTANCE_2 (CONSUMER_GROUP_B)

发出一条消息后,它只能由每个消费者组的一个实例使用。

直到两天前,它都运行良好。突然间,每条消息都被传送到所有实例,因此每条消息都被处理了多次。基本上,消费者组停止工作,消息没有分发。

要点:

我们怀疑这可能是 Confluent 上的问题或与我们当前配置不兼容的更新。 Kafka 2.2.0 was recently released 并且它对消费者群体的行为有一些改变。

我们目前正在努力迁移到 AWS MSK,看看问题是否普遍存在。

有什么可能导致这种情况的想法吗?

TL;DR: 我们通过从 Confluent 转移到 GCP 上我们自己的 Kafka 集群解决了这个问题。

我会回答我自己的问题,因为它已经有一段时间了,我们已经解决了这个问题。此外,我的见解可能会帮助其他人就在哪里部署他们的 Kafka 基础设施做出更明智的决定。

很遗憾,我们无法找到 Confluent 问题的根源。这很可能是他们那边的事情,因为我们只是迁移到 GCP 上我们自己的自我管理实例,一切都恢复正常。

关于使用 Confluent 作为托管 Kafka 服务的最终想法和警告之前的一些重要说明:

  • 我们认为这与特别影响 Node.js 的事情有关。我们用 Node 以外的语言测试了外部库,结果符合预期。在对多个最流行的 Node 库进行测试时,问题仍然存在。
  • 我们没有 Confluent 的高级支持。
  • 我无法确认这个问题不是我们的错。

考虑到所有这些要点,我们的结论是,对于决定使用 Confluent 托管服务的公司,最好计算包含高级支持的成本。否则,Kafka 将变成一个完全封闭的黑盒子,无法诊断问题。在我个人看来,在遇到问题时对 Confluent 团队的依赖是如此之大,以至于他们没有准备好在需要时提供帮助会使服务 non-production 准备就绪。