我们有一个基于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秒的消费者,但这需要时间,我们需要一个具有成本效益的短期解决方案。
1条答案
按热度按时间yr9zkbsy1#
我更倾向于推荐“半波长”架构方法。如果您已经在K8上运行,请使用Openfaas/Knative来分离这些消息的处理:
1.第一个服务,消费消息,验证消息,并旋转lambdas来处理这些消息。
1.实际上,lambdas是由Openfaas或ETC管理的,当消息处理高于500ms而不超过几分钟时,这是经典用例。当这个lambda完成处理时,它将向第一个服务返回响应。如果可以-提交偏移量,如果不可以-也提交,但重新发送到死队列。