优化性能来避免消息积压

在使用消息队列时,我们主要考虑消息的发送方和接收方这两部分的处理,而不需要关注消息队列的处理能力,因为业务逻辑往往复杂于消息队列的处理,而且这两者并不是一个量级。

所以,对于消息队列的性能优化,我们更关注的是,在消息的收发两端,我们的业务代码怎么和消息队列配合,达到一个最佳的性能

1. 发送端性能优化

发送端可能存在发送速率没有设置好,从而导致消息处理太慢。这里的一个解决办法就是并发的进行消息发送,或者说批量的进行发送,都可以提高发送端的性能。

2. 消费端性能优化

当消费端的处理能力长时间低于发送端的发送能力时,就会导致消息积压。会导致两种结果,消息队列填满,无法对外服务,或者消息丢失,这都是比较严重的事故。

消费端的优化,除了优化业务逻辑外,还可以水平扩容,增加消费端的并发数来提升总体的消费性能。特别需要注意的一点是,在扩容 Consumer 的实例数量的同时,必须同步扩容主题中的分区(也叫队列)数量,确保 Consumer 的实例数和分区数量是相等的。如果 Consumer 的实例数量超过分区数量,这样的扩容实际上是没有效果的。因为对于消费者来说,在每个分区上实际上只能支持单线程消费。

消息积压了该如何处理

这里需要注意一种情况,如果通过监控系统发现消息的发送方和处理方的速度都没什么变化,但还是出现了消息积压,就要考虑是否是一个消息处理失败,被反复执行,导致后续的消息无法处理。

参考

《消息队列高手课》