快讯 >

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

2023-02-22 04:18:35   来源:腾讯云

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


【资料图】

利用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

相关阅读

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

快讯

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

2023-02-22

焦点速讯:萨克斯工作室将哥斯达黎加人的住

快讯

哥斯达黎加建筑公司StudioSaxe扩建了现有的住宅,提供酒店客房和游泳池,从而在海滩小镇Nosara上创建了一个新

2023-02-21

世界简讯:《椿树峁》为何具有打动人心的力

快讯

《椿树峁》为何具有打动人心的力量?他们这样说|活动预告

2023-02-21

ps怎么合并图片_ps合并图片教程

快讯

ps如何合并图片?Ps合并图片教程1 首先,导入一张背景图片到新建的图层中;2 然后用鼠标拖动放置第二张图片,并适当调整

2023-02-21

若纳斯·拉马略_关于若纳斯·拉马略的简介

快讯

1、若纳斯·拉马略(JonásRamalho),全名若纳斯·拉马略·奇梅诺(JonásRamalhoChime

2023-02-21

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

快讯

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

2023-02-22

焦点速讯:萨克斯工作室将哥斯达黎加人的住所转变为镀金鬣蜥冲浪胜地

快讯

哥斯达黎加建筑公司StudioSaxe扩建了现有的住宅,提供酒店客房和游泳池,从而在海滩小镇Nosara上创建了一个新

2023-02-21

世界简讯:《椿树峁》为何具有打动人心的力量?他们这样说|活动预告

快讯

《椿树峁》为何具有打动人心的力量?他们这样说|活动预告

2023-02-21

ps怎么合并图片_ps合并图片教程

快讯

ps如何合并图片?Ps合并图片教程1 首先,导入一张背景图片到新建的图层中;2 然后用鼠标拖动放置第二张图片,并适当调整

2023-02-21

若纳斯·拉马略_关于若纳斯·拉马略的简介

快讯

1、若纳斯·拉马略(JonásRamalho),全名若纳斯·拉马略·奇梅诺(JonásRamalhoChime

2023-02-21

农业农村部:2月21日"农产品批发价格200指数"比昨天上升0.19个点

快讯

据农业农村部监测,2月21日 "农产品批发价格200指数 "为132 61,比昨天上升0 19个点,“菜篮子”产品批发价格指数为135 16,比昨天上升0 22个点

2023-02-21

每日观点:千色缭乱| 秋赤音 全新个人画集|AC-32

快讯

视觉甜品,色感绝杀,日本超人气插画师、歌手、艺术家。秋赤音全新个人画集!把极艳的色彩如同魔法一样施展。画集收录近百幅插画,以少年少女

2023-02-21

寿春是现在的什么地方?寿春是现在的哪里?

快讯

寿春是现在的安徽省淮南市寿县寿春镇。寿春县位于安徽省中部,是安徽省最早入选国家历史文化名城的城市之一。寿春在历史上4次为都,10次为

2023-02-21

为飞机智慧维修提供“中国方案”

快讯

【身边的大国工匠】原标题:20多年来,刘宇辉在科技创新的道路上不断向前(引题)为飞机智慧维修提供“中国方案”(主题)工人日报-中工网记者

2023-02-21

2月21日人民币兑美元中间价上调86个点

快讯

央行授权中国外汇交易中心公布,2023年2月21日银行间外汇市场人民币汇率中间价为:1美元对人民币6 8557元,1欧元对人民币7 3265元,100日元对人民

2023-02-21

遇见旗袍是于万千人群中的惊鸿一瞥 沿途洒满了爱的芬芳

旗袍,中国和世界华人女性的传统服装,被誉为中国国粹和女性国服。虽然其定义和产生的时间至今还存有诸多争议,但它仍然是中国悠久服饰文化

北京市电影院有序恢复开放 周五预售部分场次已满座

7月21日,北京市政府发布《北京市电影局关于在疫情防控常态化条件下有序推进电影院恢复开放的通知》,宣布全市低风险地区影院,可于7月24日

近期持续强降雨影响 第46届武汉渡江节因长江水位过高取消

武汉7·16渡江节组委会14日发布公告,由于长江武汉关水位超警戒水位,按照规定取消2020年第46届武汉7·16渡江节。受近期持续强降雨影响,

“非遗”普及受众最看重“动手”参观大师工作室非常享受

过去一段时间,国家级非遗项目灰塑传承人邵成村,多次在陈家祠等工作现场,向身边那些带着好奇目光的人们讲解灰塑的种种技术细节:草根灰、

璧山冷酒夜市 丰富市民夜间文旅活动

7月13日,位于璧山区南门唐城夜市街区的璧山冷酒夜市开街。这是璧山区打造夜间经济消费载体、培育夜间经济活动品牌的举措之一。璧山市民一

年内两市超过500家上市公司完成回购 累计回购金额超332亿元

近期A股市场持续震荡,不少上市公司或其重要股东推出回购、增持计划,用真金白银力挺股价。记者根据同花顺数据统计,今年以来,两市超过500

持续发力补链强链加大研发抢占市场 渝企跑出“加速度”

玥湖路渝快电充换电站 一辆新能源汽车,离不开研发、动力、配套等多个环节。作为汽车制造重镇,重庆在这些环节的多个板块上,正在加速奔跑

重启上市公司资本运作 康佳集团去年半导体业务营业收入为3.22亿元

近日,康佳集团正式对外发布2021年年度业绩报告。2021年,康佳集团实现全年营收491 07亿元,归属于母公司的净利润为9 05亿元,同比增长89 5

伟禄集团连续6年增长 去年营收同比增长37.5%

深港通标的之一的深圳企业伟禄集团近日公布2021年业绩。财报数据显示,伟禄集团全年营业收入11 95亿港元,同比增长37 5%,连续6年稳步增长;

龙头企业去年净利倍增 整个行业营收规模有望创造历史新高位

近日,面板龙头TCL科技、京东方分别发布2021年度业绩快报,两家企业去年归属于上市公司股东的净利润分别增长129 3%、412 86%,实现超过百亿

深圳国企全力为市民 守好“菜篮子”“米袋子”保障量足价稳

疫情防控形势下,民生物资供应是否充足成为市民最为关注的问题之一。连日来,深农集团、深粮控股等企业,充分发挥国企担当,全力为深圳市民