首页 > 解决方案 > Kafka 消费组突然停止在实例之间平衡消息

问题描述

我们有一个由 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 最近发布,它对消费者群体的行为进行了一些更改。

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

关于可能导致这种情况的任何想法?

标签: apache-kafkakafka-consumer-apiconfluent-platform

解决方案


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

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

不幸的是,我们无法深入了解 Confluent 的问题。这很可能是他们这边的事情,因为我们只是迁移到 GCP 上自己的自我管理实例,一切都恢复了正常。

在我对使用 Confluent 作为托管 Kafka 服务的最终想法和警告之前,有一些重要的澄清:

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

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


推荐阅读