如何处理消息积压-消费端

180 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第20天,点击查看活动详情

前言

前面有提到过,在使用消息队列时,很多的性能问题都出在消费端,常见的情况就是消费速度跟不上发送端生产消息的速度,以此会出现消息队列都被数据填满,最终导致消息积压,对系统和业务都是严重影响。

方案

根据消费效率控制实例数

在对系统进行开发和上线时,对系统的流量以及消费端消费消息的效率就应该提前测试,依据实际的业务情况,控制消费者的实例数,保证消费消息的速度要高于生产者产生消息的速度。

另外,在消费端进行代码开发时,要时刻注意代码幂等性以及无状态性,也就是需要避免多实例下数据各自缓存而导致的数据不一致问题,这也是分布式系统开发需要注意的问题。

消费者在扩展实例时,需要注意同时控制消息队列主题下的分区数,尽量保证一个分区对应一个消费者,因为每个分区下都是单线程消费,如果是多个消费者对应一个分区,其实对于效率的提升来说微乎其微,因为消费者消费消息的效率是固定的,消费完一批次的数据才能进行下一次消费,所以多实例对应一个分区和单实例对应一个分区的效率几乎是一致的。

消费端性能问题

在代码书写不规范的情况下,系统出现内存泄漏,始终有垃圾对象回收不掉,因此系统会变得越来越慢,因为随时间的增加,系统发生垃圾回收的次数会越来越频繁,而导致系统性能变低,这也是会导致消息积压的原因之一。

这种情况下一个是需要系统内存的监控工具,另一个是需要定期的分析日志,判断系统的运行状态和稳定性,发现问题不可怕,可怕的是没发现的问题,只要暴露出问题所在,即使麻烦,但也都是能解决的。

其他情况是消费端出现死锁问题、或者是消费端除了程序外,还有其他耗费系统资源的进程存在,例如下载软件、上传文件等,或者有耗费CPU性能的大量计算,抢夺系统资源,也会导致系统的效率变低,从而导致消息积压,这需要从系统层面去排查。