RabbitMq TTL+死信队列 延迟消息问题记录 焦点快报

来源:腾讯云 |2023-02-25 21:07:46

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

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

责任编辑:【henankuaibao】

关键词: RabbitMQ

本文相关推荐

RabbitMq TTL+死信队列 延迟消息问题记录 焦点快报

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

02月25日 21:07 要闻

左右脑的功能有哪些_左右脑的功能是什么

1、左右脑的大部分功能都是右利手,所以左半球属于优势半球。2、左半球的主要功能是逻辑、理解、记忆、分析和语言,也叫语言脑

02月25日 17:47 要闻

六艺经传

1、“六经”的经文和传文。2、六艺,此处是指六经。3、即《诗》、《书》、《礼》、《乐》、《易》、《春秋》,“传”指传记,

02月25日 17:46 要闻

速递!瑜伽环怎么用视频教程_瑜伽环怎么用

1、瑜伽环放在双脚上,平躺用手拉住瑜伽环就可以做仰卧起坐,双臂放在胸前就可以做上半身的胸部挤压,放在腿的一侧就可以做大腿

02月25日 14:43 要闻

开学网

1、开学网致力于传播知识,分享技术以促进社会文明发展的理念,为可持续发展的经济文化社会提供技术和思想平台,是一套综合性的

02月25日 12:11 要闻

即时焦点:辽宁男篮主教练杨鸣:克服困难 做好球队磨合

辽宁男篮主教练杨鸣:克服困难做好球队磨合---新华社沈阳2月24日电(记者潘昱龙)辽宁男篮24日在主场进行了公开训练,主教练杨鸣表示球队目前

02月25日 12:06 要闻

天天热推荐:曹德旺宴请一位日本商人,才喝1杯酒,日本商人扑通一下就跪下了

曹德旺宴请一位日本商人,才喝1杯酒,日本商人扑通一下就跪下了,日本,福耀,曹德旺,任正非,王健林,心若菩提,成功人士

02月25日 09:04 要闻

丽景轩港式茶餐厅

1、丽景轩港式茶餐厅是一家茶餐厅。2、位于成都锦江区纯阳观街3号。文章到此就分享结束,希望对大家有所帮助。

02月25日 06:43 要闻

白银杀人狂_关于白银杀人狂的介绍 世界快看点

1、甘肃省白银市连环杀人案,是指从1988年至2002年的14年间,在中国甘肃省白银市有11名女性惨遭入室杀害的案件,部

02月25日 05:51 要闻

世界即时看!VMware提示内部错误的解决方法_vmware虚拟机内部错误

1、Vmware是我们经常使用的一种虚拟机软件,但是有时候在运行虚拟机的时候会提示“内部错误”,无法打开虚拟机。这时候有

02月25日 01:01 要闻

上海身份证办理及补换指南(上海市民+外省市居民)|天天热门

身份证办理(首次申领)一、办理条件1、本市户籍:为上海市常住户口公民2、外省市户籍:上海公安机关在全市范围推开全国范围首次申领居民身份

02月24日 22:24 业界

天天精选!动力学模型拟合_动力学模型

1、按化学反应的不同特点和不同的应用要求,常用的动力学模型有:从实用角度出发,不涉及反应机理,以较简单的数学方程式对实

02月24日 21:47 要闻

天天快资讯丨走向辉煌

1、走向辉煌是鞍山一中校歌。2、作词者齐晓阳。3、作曲者方湘雪。4、作于2003年8月。文章到此就分享结束,希望对大家有

02月24日 21:48 要闻

天津公安东丽分局关于分局人口服务管理中心搬迁的公告

》》》最新消息:2月24日,“平安东丽”微信公众号发布关于公安东丽分局关于分局人口服务管理中心搬迁的公告,具体如下:公安东丽分局人口服...

02月24日 20:09 业界

今日聚焦!杭州公积金贷款

贷款条件按规定正常足额缴存住房公积金,且在申请贷款时已连续缴存6个月(含)以上;购买住房为本市普通自住住房,有符合法律规定的购、建房合同

02月24日 19:07 业界

本人工资比单位平均工资高的话生育津贴怎么发放?-动态焦点

经小编咨询0571-12333医保工作人员,得到回复:生育津贴发放依然按照用人单位申报的月平均工资÷30×应计发天数来计算。高出部分单位有条件可

02月24日 19:26 业界

热消息:分娩镇痛等检查在医保定点医疗机构可以直接结算吗?

早孕期胎儿结构超声筛查、胎儿系统彩色多普勒超声检查可按规定在医保定点医疗机构直接结算;调整后的分娩镇痛项目因信息技术问题暂不能直接结

02月24日 19:20 业界

当前观点:杭州普通话水平考试时间

考试时间2023年2月18日、19日8时30分—14时,上午场750人,下午场450人。考试地点杭州市教育发展服务中心(杭州市重机巷56号)。报考须知1 测试采

02月24日 19:09 业界

杭州普通话水平考试准考证怎么打印

查询方式:点击进入全国普通话培训测试信息资源网,点击首页报名入口,再点击打印准考证,输入个人信息即可查询。报考须知1 测试采用大机房机

02月24日 19:25 业界

逃离后宫什么时候出 公测上线时间预告

导读:最近很多玩家都在关注逃离后宫这款手游,想知道具体的公测时间,逃离后宫会经过封测、删档内测、不删档测试到最终的公测等几个测试阶段

02月24日 19:16 要闻

上海市公积金提取额度

公积金提取额度(一)购买拥有所有权自住住房的,该所购住房在一个自然年度内因交易可以提取一次,不能办理多次提取。如该住房确因职工自住需要

02月24日 18:26 业界

全球视点!2023第133届广交会时间和展品有哪些?

2023第133届广交会时间和展品有哪些?第一期:2023年4月15日—19日;参展范围:电子及家电、电子消费品、照明、车辆及配件、机械、五金工具、建

02月24日 18:07 业界

广州健康管理师考试报名材料

(1)《广东省卫生健康行业职业技能鉴定个人申请表》(报名系统导出打印,经本人签字确认,一式二份),报考开始时,报考人员在系统填报;(2)报考人

02月24日 18:05 业界

滚动:2023广州文旅消费券路演派消费券活动在哪里举行?

2023广州文旅消费券路演派消费券活动在哪里举行?☑领券地址:广百百货(北京路店)南门☑适用范围:广百百货、新大新国风、天河城百货(均为北京

02月24日 18:22 业界

广州人才入户需要居住证吗-世界今日讯

问:广州人才引进入户要居住证吗?答:不需要居住证。人才入户办理材料如下:(系统须上传原件彩色扫描件,扫描件内容须完整清晰可见,支持的附

02月24日 18:25 业界

2023石家庄正定购车补贴怎么领

领取方式补贴兑现流程:顾客交清车款——企业开具发票——税务部门审核——审核通过顾客交清剩余车辆购置税——参与促销企业向商务局备案。...

02月24日 17:22 业界

【环球热闻】芜湖市公积金贷款利率

自2022年10月1日起,芜湖市住房公积金管理中心对首套个人住房公积金贷款利率进行调整:1、自2022年10月1日起,下调首套个人住房公积金贷款利率

02月24日 17:10 业界

2023广州黄埔波罗诞庙会怎么预约?

2023广州黄埔波罗诞庙会怎么预约?预约时间:南海神庙:提前一个月预约广州海事博物馆:提前19天预约预约入口:※特别提醒:南海神庙与广州海

02月24日 17:12 业界

全球观天下!广东高考美术合格线多少2023

2023广东高考舞蹈术科统考本专科合格线为150分。舞蹈类考生术科统考成绩达到相应的合格线,方可报考对应层次的省术科统考或省术科统考涵盖校考

02月24日 17:08 业界

2023广州新生儿出生一件事操作流程+图解

2023广州新生儿出生“一件事”办理流程:1 打开“穗好办”APP“办事”页面进入“更多服务”专题,点击“医疗服务”;(点击查看大图)2 在...

02月24日 17:04 业界