当消费者遇到瓶颈(消息处理时间长)时,如何伸缩Kafka消息消费?

uxhixvfz  于 2022-10-07  发布在  Kafka
关注(0)|答案(1)|浏览(242)

我们有一个基于Apache-Kafka(2.7.0)编写的KafkaSDK,我们使用它来生成和消费指向Kafka主题的消息。

默认情况下,配置如下-

  • 自动提交设置为FALSE
  • 我们使用CommSync()进行偏移量
  • 消费者的轮询频率为1000毫秒
  • Max.poll.Records设置为2
  • 消费者是单线程,每个示例/示例的单消费者运行(我们使用EKS)

现在,有一个order service生成order-created Message to Order主题,它被另一个满足订单fulfil service的服务使用。实现逻辑平均花费20秒来处理这条消息(太高了!)

因此,即使我们在主题中有10个分区和10个应用程序示例/消费者在运行(它们都属于同一个消费者组),我们每分钟也只能处理3条消息(总共30条消息/分钟)。

峰值产生消息的速度的问题大约是每分钟300条。即使我们扩展到50个分区和50个消费者,我们每分钟也只能处理150个。即使在这里,每个消费者在CPU和内存使用率方面仍然没有得到充分利用。

正因为如此,随着时间的推移,消费者的滞后程度会大大增加。

我们如何扩展以解决这个问题?我们不能让100名未得到充分利用的消费者继续运营,因为这不符合成本效益。请提供任何解决此问题的建议。

PS.:我们正在研究如何优化平均花费20秒的消费者,但这需要时间,我们需要一个具有成本效益的短期解决方案。

yr9zkbsy

yr9zkbsy1#

我更倾向于推荐“半波长”架构方法。如果您已经在K8上运行,请使用Openfaas/Knative来分离这些消息的处理:

1.第一个服务,消费消息,验证消息,并旋转lambdas来处理这些消息。
1.实际上,lambdas是由Openfaas或ETC管理的,当消息处理高于500ms而不超过几分钟时,这是经典用例。当这个lambda完成处理时,它将向第一个服务返回响应。如果可以-提交偏移量,如果不可以-也提交,但重新发送到死队列。

相关问题