消息队列常见面试题:消息队列如果遇到消息积压,该如何解决?

面试题 潘老师 10个月前 (06-15) 48 ℃ (0) 扫码查看

今天咱们来聊聊在生产环境中,如果使用的消息队列遇到消息积压该怎么解决。这可是个常见又关键的问题。

我们都清楚,消息队列中的消息通常存放在内存里,要是出现过量的消息积压,就可能引发内存或磁盘告警,导致响应超时、连接阻塞,还会影响其他队列使用,让整体服务不可用。

那为啥会出现消息积压呢?其实消息队列有生产端和消费端,一进一出。积压的原因要么是生产端产生消息太快太多,要么是消费端消费消息太慢。所以解决方案也就从这两方面着手,要么限制生产者产生消息,要么加快消费端消费消息。

限制生产者产生消息,常见的就是限流、熔断和降级,通过限流算法、熔断策略把一部分流量挡在外面。比如常见的令牌桶算法,先让一部分用户进来,其他用户排队等系统发令牌。熔断呢,就是系统压力过大,请求超时或响应失败达到一定次数,就自动触发熔断断开服务,把用户挡在外面。这是在消息积压源头做限制。

再看消费端,优化策略是加快消息消费速度。消费端可以扩容,让多个消费端同时消费消息,这相当于横向扩展。要是业务代码处理慢,就优化代码逻辑。要是瓶颈在数据库,处理慢,可以先存到 Redis 中,等不忙时再划到数据库里。可能有人会说,设置消息过期时间,到时直接从队列删除就行。但不太建议这么做,虽然方便但可能有风险。

总结一下,解决消息积压就两个方面,一是做好限流,防止过多请求造成积压;二是做好消费端优化,要么扩容,要么优化代码,要么改变存储策略,在消费端瓶颈上下功夫。

好了,今天的内容就到这儿,如果您对本期内容有任何疑问,欢迎在评论区留言。谢谢大家!


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/ms/13049.html
喜欢 (1)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】