怎么处理消息积压问题?
消息积压是我们在使用消息队列时经常遇到的问题,它的直接原因是系统中某个部分出现了性能问题,没有来得及处理上游发送的消息。
优化性能避免消息积压
当我们引入消息系统后,站在消息系统的角度,整个系统可以分为三部分:1. 消息生产者,2. 消息队列,3. 消息消费者。
我们在谈论优化性能避免积压消息时,重点会放在消息生产者和消息消费者这两部分。对于绝大多数使用消息队列的业务来说,消息队列本身的处理能力要远大于业务系统的处理能力。
消息生产者性能优化
如果我们的代码发送消息的性能有问题,我们可以检查一下是不是发消息之前的业务逻辑耗时太多了。
我们可以通过调整发送消息的批量大小,或者增加并发,来解决消息生产者面临的问题,至于应该选择批量发送还是增加并发,主要取决于发送端程序的业务性质。
- 线上运行的微服务,主要接收RPC请求处理在线业务,它对请求响应时延比较敏感,适合并发的方式来提升性能。
- 离线分析系统,不关心时延,更注重整个系统的吞吐量,这种情况适用于批量方式来提升性能。
消息消费者性能优化
我们要保证消费端的性能要好于生产端的发送性能,这样的系统才能健康的持续运行。
消费端除了优化消费业务之外,也可以通过水平扩容,增加消费端的并发数来提升性能,需要注意的是,在扩容消费者的实例数量的同时,必须同步扩容主题中的分区(队列)数量,确保Consumer的数量和分区的数量是尽量相等的。
如果Consumer的实例数量超过分区数量,这样的扩容是完全没有效果的,因为同一个分区(队列)同时只能有一个Consumer去处理消息。
怎么处理积压消息?
导致消息队列突然增加积压的原因有两种:要么消息发送变快了,要么消息消费变慢了。
大部分消息队列都内置了监控的功能,只要通过监控数据,很容易确定是哪种原因。
如果短时间内没有足够的服务器资源区进行扩容,那么可以考虑对服务进行系统降级,通过关闭一些不重要的业务,减少发送方发送的数据,最低限度让系统保持正常运转,服务一些重要业务。
如果我们发现无论是发送消息的速度还是消费消息的速度和原来相比没有什么变化,可以去检查一下消费端,看看是不是因为消费失败导致了一条消息被反复消费,这样也会拖慢这个系统去消费消息的速度。