七、如何解决消息积压

如何避免消息积压?

通过优化性能来避免消息积压。对于 RocketMQ 和 Kafka,它们每秒钟可以处理几十万条消息,而一般的业务系统,单个节点可以处理几百到几千次请求,都是非常好的了,所以优化性能时,主要关注的是消息的发送端和接收端。

  1. 优化发送端的性能。可以通过增加每次发送消息的批量大小,或者增加并发,来优化发送性能。如果是一个注重响应时延的在线业务,如果选择批量发送,会影响时延,所以应该通过增加并发来优化性能。如果是一个离线分析系统,并不关注响应时延,而是注重系统的吞吐量,应该选择批量发送,通过增加发送消息的批量大小来优化性能。
  2. 优化消费端的性能。如果消费速度跟不上生产消息的速度,就会造成消息积压,所以在设计系统时,要保证消费端的消费性能高于生产端的发送性能,这样性能才能健康持续的运行。 可以通过水平扩容,增加并发来提升消费性能,这里要注意必须同步扩容主题中的分区数量(RocketMQ中叫队列,Kafka中叫分区),来保证消费者数量和分区数量是相等的,因为每个分区只能支持单线程消费,所以如果消费者数量超过了分区数量,那扩容是没有效果的。

消息积压了如何处理?

  1. 首先能想到的是,要么发送变快了,要么消费变慢了。可以通过消息队列内置的监控功能来定位原因。
  2. 如果通过监控数据发现是发送端产生的消息增多(比如整点抢购),可以通过扩容消费端的消费者数量来提升整体的消费能力。如果没有足够的服务器资源进行扩容,可以考虑进行系统降级,也就是关闭一些不重要的业务来减少发送端发送的数据量。
  3. 如果通过监控数据发现发送消息的速度和消费消息的速度并没什么变化,那么有可能是消费端消费失败导致一条消息反复消费,从而拖慢了整体的消费速度。
  4. 如果监控到消费变慢,可以检查下日志,看看是否是因为消费线程卡在了什么地方,比如触发了死锁。
发布了307 篇原创文章 · 获赞 11 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/dl674756321/article/details/105332035