RabbitMq TTL+死信队列 延迟消息问题记录_资讯

延迟队列存储的对象是对应的延迟消息,所谓的延迟消息是指当消息被发送以后,并不想让消费者立刻拿到消息,而是等待特定时间后,消费者才能拿到这个消息进行消费


(资料图片仅供参考)

利用RabbitMqTTL和死信队列 来实现延时消费。

如果设置的是队列统一过期时间放到死信队列,没有什么问题。

如果是延时时间设置到每条消息上的。而不是给队列的。

实现方式为消息存活时间为动态用户页面可配置的。

这就导致了一个问题:

先用一条消息的存活时间是1天。后面又进了一条消息存活时间是1小时。

结果一小时到了,发现这条消息并没有被转发到消费延时过期消息的队列。

原因是尽管ttl是设给每条消息的。但是本质上,所有延时消息都还在一个队列里,对它过期时间的检测也是从头部开始的。

它不会检测每一条消息是否过期。而是顺序检测。

如果first in的消息过期时间很长,会导致它阻塞后进的消息。

不仅无法实现真正的过期时间。还会导致,一个大的过期时间的先进的消息,会堆积一堆后进的过期时间短的消息。

问题解决

这个时候可以使用rabbitMq的一个插件:rabbitmq_delayed_message_exchange

一段时间以来,人们一直在寻找用RabbitMQ实现延迟消息的传递方法,到目前为止,公认的解决方案是混合使用TTL和DLX。而rabbitmq_delayed_message_exchange插件就是基于此来实现的,RabbitMQ延迟消息插件新增了一种新的交换器类型,消息通过这种交换器路由就可以实现延迟发送

插件安装

需要根据自己的rabbitMq选择对应的版本。我rabbitMq的版本是RabbitMQ 3.11.0,对应的插件版本就是:3.11.1

基于Linux

--1、cd到rabbitmq默认安装位置cd /usr/lib/rabbitmq/lib/rabbitmq_server-3.7.18/plugins--2、通过ftp工具将插件上传到此目录下--3、开启插件rabbitmq-plugins enable rabbitmq_delayed_message_exchange--4、重启MQ服务systemctl restart rabbitmq-server

基于Docker

--1、通过ftp工具将插件上传到Linux服务器的根目录下--2、拷贝到docker中rabbitmq插件目录下,rabbitmq_delayed_message_exchange-3.9.0.ez(下载包的全名)docker cp /rabbitmq_delayed_message_exchange-3.9.0.ez 容器ID:/plugins--3、进入容器docker exec -it 容器id /bin/bash--4、查看插件是否存在(确保2中的操作已经将插件拷贝过来了)cd pluginsls |grep delay--5、开启插件rabbitmq-plugins enable rabbitmq_delayed_message_exchange--6、退出容器exit--7、重启MQ服务docker restart 容器ID

安装成功

web界面新建交换机选择类型出现红框标注即表示成功

image.png

代码实现

1:springBoot配置

@Configurationpublic class DelayRabbitmqConfig {     /**     * 声明延迟队列     * @return     */    @Bean    public Queue delayQueue(){        return new Queue(QueueConstant.DelayQueue,                true,false,false);    }     /**     * 声明延迟自定义交换机类型     * @return     */    @Bean    public CustomExchange delayCustomExchange(){        HashMap args = new HashMap<>();//        设置 x-delayed-type 为 direct,当然也可以是 topic 等 发送消息时设置消息头 headers 的 x-delay 属性,即延迟时间,如果不设置消息将会立即投递        args.put("x-delayed-type","direct");        return new CustomExchange(ExchangeConstant.DelayCustomerExchange,                "x-delayed-message",true,false,args);    }     /**     * 绑定延迟交换机和队列     * @return     */    @Bean    public Binding delayQueueAndCustomExchange(){        return BindingBuilder.bind(delayQueue())                .to(delayCustomExchange()).with(RoutingKeyConstant.DelayCustomerRoutingKey).noargs();    }}

springMvc配置

引入依赖:    xmlns:util="http://www.springframework.org/schema/util"    http://www.springframework.org/schema/util    http://www.springframework.org/schema/util/spring-util-4.0.xsd                                                                                                                

代码实现

//消息发送final MessagePostProcessor messagePostProcessor = new MyMessagePostProcessor(Integer.valueOf(ttl.toString()));DisTimingPushDto disTimingPushDto = new DisTimingPushDto();disTimingPushDto.setOrderId(dispense.getOrderId());disTimingPushDto.setPushTime(disDispense.getPushTime());rabbitTemplate.convertAndSend(MsgQueueEnum.TIMING_PUSH.getExchangeName(), MsgQueueEnum.TIMING_PUSH.getQueueName(), disTimingPushDto, messagePostProcessor);//每条消息时间配置import org.springframework.amqp.AmqpException;import org.springframework.amqp.core.Message;import org.springframework.amqp.core.MessagePostProcessor;/** * 延迟消息处理器 Processor * @author king * @date 2022年12月28日 11:14 */public class MyMessagePostProcessor implements MessagePostProcessor {    /**     * 消息延迟时间,单位:毫秒     */    private final Integer TTL;    public MyMessagePostProcessor(final Integer ttl) {        this.TTL = ttl;    }    @Override    public Message postProcessMessage(Message message) throws AmqpException {        message.getMessageProperties().setDelay(TTL);        return message;    }}

关键词: RabbitMQ

热门玩具潜藏着产品警示不足、化学物质参数不详等雷区 化学实验能“玩”?

彩虹喷泉、火山喷发、浓烟瀑布……为了吸引家长购买,部分商家将化学实验搬到了孩子们的玩耍场景中。近日,北京商报记者调查发现,电商平台

北京商报 2022-07-08

做好降速准备618电商大促家电业不容乐观 原材料供应高位运行推高成本

一季度家电行情双线下滑、疫情面扩大消费受到影响、工商业生产和供应链受到影响,这三个因素或对618电商大促产生重要的影响。今年3月以来,

蓝科技 2022-05-20

4月增收5月减产 产能释放时间拉长巨头们撑不住了吗?

深陷亏损中的生猪行业,笑到最后的选手或不仅有家底,更要会审时度势。4月生猪价格上涨后,头部上市猪企的销售收入随即上涨。不过,不少上

中国商报网 2022-05-20

人民币对美元即期汇率当日收盘报6.7472 较上一交易日涨495个基点

5月17日,人民币对美元汇率迎来久违的大涨。人民币对美元即期汇率当日收盘报6 7472,较上一交易日涨495个基点,创出了一年多的最大升值幅度

深圳商报 2022-05-20

疫情倒逼餐饮业寻求新商机 开启花式自救

国家统计局近日发布的数据显示,今年1—4月餐饮收入13262亿元,同比下降5 1%;其中4月餐饮收入2609亿元,同比下降22 7%。值得关注的是,近几

中国商报网 2022-05-20

广西粮食生产进度均快于去年同期 实现良好开局

今年以来,广西各级农业农村部门提早谋划、主动作为,积极抓好农业生产。据农情统计,全区春种粮食作物面积已超过全年任务的一半,超额完成

农民日报 2022-05-20

“宠物牵引用具第一股”IPO过会 发行后总股本不超过13635万股

源飞宠物IPO近日过会,拟登陆深交所主板,成为宠物牵引用具第一股。 资料显示,源飞宠物主营宠物用品和宠物零食的研发、生产和销售,主要

深圳商报 2022-05-20

热门玩具潜藏着产品警示不足、化学物质参数不详等雷区 化学实验能“玩”?

彩虹喷泉、火山喷发、浓烟瀑布……为了吸引家长购买,部分商家将化学实验搬到了孩子们的玩耍场景中。近日,北京商报记者调查发现,电商平台

北京商报 2022-07-08

做好降速准备618电商大促家电业不容乐观 原材料供应高位运行推高成本

一季度家电行情双线下滑、疫情面扩大消费受到影响、工商业生产和供应链受到影响,这三个因素或对618电商大促产生重要的影响。今年3月以来,

蓝科技 2022-05-20

4月增收5月减产 产能释放时间拉长巨头们撑不住了吗?

深陷亏损中的生猪行业,笑到最后的选手或不仅有家底,更要会审时度势。4月生猪价格上涨后,头部上市猪企的销售收入随即上涨。不过,不少上

中国商报网 2022-05-20

人民币对美元即期汇率当日收盘报6.7472 较上一交易日涨495个基点

5月17日,人民币对美元汇率迎来久违的大涨。人民币对美元即期汇率当日收盘报6 7472,较上一交易日涨495个基点,创出了一年多的最大升值幅度

深圳商报 2022-05-20

疫情倒逼餐饮业寻求新商机 开启花式自救

国家统计局近日发布的数据显示,今年1—4月餐饮收入13262亿元,同比下降5 1%;其中4月餐饮收入2609亿元,同比下降22 7%。值得关注的是,近几

中国商报网 2022-05-20

广西粮食生产进度均快于去年同期 实现良好开局

今年以来,广西各级农业农村部门提早谋划、主动作为,积极抓好农业生产。据农情统计,全区春种粮食作物面积已超过全年任务的一半,超额完成

农民日报 2022-05-20

“宠物牵引用具第一股”IPO过会 发行后总股本不超过13635万股

源飞宠物IPO近日过会,拟登陆深交所主板,成为宠物牵引用具第一股。 资料显示,源飞宠物主营宠物用品和宠物零食的研发、生产和销售,主要

深圳商报 2022-05-20
x 广告
x 广告
x 广告

Copyright   2015-2022 西方仓储网版权所有  备案号:沪ICP备2020036824号-7   联系邮箱:5 626 629 @qq.com