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

时间:2019-05-15 16:23:24

标签: apache-kafka kafka-consumer-api confluent

我们有一个由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)

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

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

重要点:

  • 我们在GCP的Confluent中使用Kafka paas。
  • 我们在不同的环境中进行了测试,一切都按预期运行
  • 我们的消费者没有任何改变
  • 我们对集群没有任何更改(我们不知道Confluent是否更改了某些内容)

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

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

关于什么原因的任何想法?

1 个答案:

答案 0 :(得分:0)

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

一段时间以来,我将回答我自己的问题,我们已经解决了这个问题。另外,我的见解可能会帮助其他人就将Kafka基础架构部署到何处做出更明智的决定。

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

在我关于将Confluent用作托管Kafka服务的最终想法和警告之前,需要进行一些重要的澄清:

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

考虑到所有这些点,我们的结论是,对于那些决定通过Confluent使用托管服务的公司而言,最好的方法是在包含高级支持的情况下计算成本。否则,Kafka会变成一个完全封闭的黑匣子,从而无法诊断问题。我个人认为,问题期间对Confluent团队的依赖是如此之大,以至于在需要时没有准备好帮助他们就使服务无法投入生产。