在我之前遇到的一个企业数据云备份平台中,一次偶然的情况两个大客户的备份作业在同一时间段被触发,并且都是全量备份作业。这就导致了生产者生产了上千万条消息,然而我们业务中读取备份作业信息的agent机器还没有及时扩充,导致了消费者无法及时处理大量的消息。在此问题后,我总结了一下测试人员在遇到kafka消息积压问题时的处理方式。
Kafka 消息积压的原理
生产者角度
1. 生产速率过高:
当生产者 生产消息的速度远远超过消费者处理消息的速度时,就会导致消息积压。
案例1:企业数据云备份平台中,一次偶然的情况两个大客户的备份作业在同一时间段被触发,并且都是全量备份作业。这就导致了生产者生产了上千万条消息,然而我们业务中读取备份作业信息的agent机器还没有及时扩充,导致了消费者无法及时处理大量的消息。
消费者角度
1. 消费能力下降:
消费者处理消息的逻辑可能变得复杂,导致消费每条消息的时间变长。
2. 消费者数量不足:
如果消费者的数量过少,无法满足生产者发送消息的速率。例如,一个 Kafka 主题有 10 个分区,正常情况下需要 10 个消费者(每个消费者负责一个分区)来高效地消费消息。但如果只有 5 个消费者,那么消息就会积压在未被消费的分区中。
3. 消费者故障:当消费者出现故障(如程序异常、网络问题等)时,它所负责的分区消息就无法正常消费。
案例2:还是之前遇到的数据云备份平台,在某一次监控中发现消息出现了堆积,查到原因后发现是由于在某一个特殊消息的处理逻辑中,前置了消息的处理状态,但是消费者还没有真正将消息拿走,由于这条消息一直在消息分区中存在,但是消费者无法拿走消息,就导致了消息的积压。
kafka 消息积压后的处理
在关于如何处理线上消息积压的问题,我们使用上述的案例1讨论。
企业数据云备份平台中,一次偶然的情况两个大客户的备份作业在同一时间段被触发,并且都是全量备份作业。这就导致了生产者生产了上千万条消息,然而我们业务中读取备份作业信息的agent机器还没有及时扩充,导致了消费者无法及时处理大量的消息。
预处理
调整生产者速率:
与开发人员沟通,通过总控制平台来调整这两个大客户的消息发送的数量,来缓解”生产者“消息的产生量。
手动扩充消费者资源:
在发现消息积压后,已经确定是由于大客户作业导致消息体量大幅度增加,因此,我们需要迅速的联系运维和开发人员对“消费者“机器进行扩充。在此期间测试人员需要实时关注消息监控,确保增加agent机器后消息积压问题能被暂时缓解。
确定问题的影响范围
在紧急处理后,消息积压问题得到了暂时缓解后,我们需要协助开发确定问题的影响范围。并且需要根据:该问题是否为偶然问题?为什么”消费者“机器没有自动扩充?等问题展开讨论,然后确定问题的严重程度以及是否需要立即在线上修复。
在讨论之后,开发和测试人员一致决定要在线上迅速修复该问题,以避免再次出现消息堆积。
问题复现
测试人员需要模拟生产环境配置,主要是关于agent 机器的相关配置。然后协助发发人员复现问题,查看”消费者“机器没有自动扩充的原因。
修复问题并测试
在问题复现后,在测试环境中模拟类似的消息积压场景,对自动扩充功能进行全面测试。调整备份作业的触发时间和消息生产数量,观察自动扩充机制是否能够正常工作。
上线并测试
在测试环境模拟测试完成后,打包并部署生产环境。然后恢复两个大客户的消息发送的数量,并持续监测消息的处理。确保在生产环境中自动扩充逻辑能正常执行。
长期解决方案与优化
在生产环境消息积压问题彻底解决后,我们和团队讨论了优化备份作业的调度策略,避免多个大客户的全量备份作业在同一时间段集中触发。可以根据客户的业务繁忙程度、数据重要性等因素,制定更加合理的备份计划。
另外,对消费者资源管理机制进行完善,包括自动扩充机制和资源回收机制的优化。