rabbitMQ延时消息问题描述

rabbit延时消息 可以设置为队列延时和消息延时,队列延时时队列里的每条消息都会延时一样的时间,而消息设置TTL时可以为每一条消息设置延时
此时,消息延时有个严重问题,如果前面的消息延时时间大于后面的消息,就会发生堵塞。
例如:消息A 设置延时 10S ,后一条消息B设置延时 3S,这个时候按需求来讲,3秒过后消息B应该会被消费者消费,但实际上消息B被堵塞了,直到消息A的TTL过期后A,B消息同时放出

rabbitMQ延时消息解决方案

  1. 可以使用rabbitMQ 的一个延时队列插件,使用下载安装参考: https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases
  2. 使用定时任务框架或平台动态创建临时任务控制下发消息
  3. 建立多个不同延时时间的队列,基于业务向相应队列添加消息

rabbitMQ延时消息的思考与优化

延时消息对rabbitMQ压力很大,一般来讲TTL设置的时间不应过长,比如一个订单业务等待客户付款,等待30分钟后发送消息检测订单支付状态并完成取消超时订单
设置30分钟检查订单状态存在两个问题:

  1. 如果并发较高,30分钟可能堆积消息过多,对MQ压力过大
  2. 大多数订单再下单后很短时间内就会支付,但是却需要在MQ内等待30分钟,浪费资源。

解决措施:设置不同的等待时间:10s、10s、10s、15s、15s….,这些时间相加得到30分钟,不同延迟时间过滤掉大部分的消息,给MQ减压
每次延时消息消费时首先先查询支付状态,判断是否支付,如果状态显示未支付,则获取下次延迟时间,判断是否有延迟时间,有则重发延迟消息,没有延迟消息则取消订单。如果订单显示已支付,则标记未已支付。
这种方式也叫做多级延时消息处理方案