RabbitMq TTL+死信队列 延迟消息问题记录-观速讯
2023-02-26 01:06:12 来源:腾讯云

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

利用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 TTL+死信队列 延迟消息问题记录-观速讯

2023-02-26

世界观点:感受鲜活热烈的新疆生活 跟着央视镜头逛《巴扎》

2023-02-25

2015年假期_环球实时

2023-02-25

新强联:单列圆锥滚子轴承实现小批量生产

2023-02-25

环球关注:中海港务 莱州公司

2023-02-25

天天速递!专家分析青少年患牛皮癣的原因。

2023-02-25

热门看点:凯里公路管理段:及时修复波形护栏 保障公路安全畅通

2023-02-25

临邑县恒源街道李官道志愿服务队 最新资讯

2023-02-25

梦想城镇的慢穿之旅

2023-02-25

天天快消息!后脑勺和脖子交界处痛怎么缓解一下_后脑勺和脖子交界处痛怎么缓解

2023-02-25

胎教每日一页

2023-02-24

弹冠振衣_关于弹冠振衣的基本详情介绍

2023-02-24

泗阳县发改局“五字诀”做实粮食安全工作|世界报道

2023-02-24

环球热头条丨二手车鉴定评估基础与实务

2023-02-24

开学第一课观后感怎么写_关于开学第一课观后感范文

2023-02-24

焦点观察:全国最大!厦门北站新建高铁站智能天窗建成亮相

2023-02-24

ISC数字安全生态联盟助力上海集聚近百创新企业|世界今亮点

2023-02-24

东星医疗(301290):2023年2月23日投资者关系活动记录表

2023-02-24

广东破获涉偷渡走私案现场曝光!热心举报市民获颁114万元

2023-02-24

香雪制药:FDA对Klisyri_KX2391软膏的新药申请已批准

2023-02-24

海南儋州:企业带动 沉香树成村民“致富树”

2023-02-24

罕见!百亿私募被申请破产,啥情况?多项经营异常,母公司连续4年亏损……

2023-02-24

攀枝花警方打掉一组织他人偷越国(边)境犯罪团伙 抓获113名犯罪嫌疑人

2023-02-23

发字组词的读法-全球快资讯

2023-02-23

DNF旭旭宝宝合同即将到期,操作吓坏斗鱼,网友:转战小风车?

2023-02-23

羊的简笔画幼儿简单_羊的简笔画

2023-02-23

全球通讯!JavaWeb day5 Tomcat配置及idea创建Maven-Tomcat项目

2023-02-23

天天观焦点:零刺青之声金手指,一年之计在于春春归柳叶鸟声翠波气熏蒸三旧五星星点灯在六时

2023-02-23

世界快消息!天成自控:智己项目我们供应了部分部件,对公司经营影响不大

2023-02-23

依旧魔力宝贝官网_依旧魔力_速递

2023-02-23

天天热讯:珠海新型冠状病毒肺炎疫情:2月23日珠海疫情最新消息今天数据统计情况通报

2023-02-23

五菱版QQ要来了!或不超5万外观很呆萌,续航330Km竞争比亚迪海鸥

2023-02-22

高质量发展看广东|“机器人生产机器人” 自动化推动中国“智”造

2023-02-22

华纳药厂:2022年度净利润同比增长12.23%

2023-02-22

利好中央别墅区!这座大桥改造工程开工,未来出行更方便!-全球快资讯

2023-02-22

什么是半流食食谱大全_流食食谱大全

2023-02-22

女柜员钻漏洞取现398万后整容逃亡 案件详情始末细节披露!

2023-02-22

孩之宝的2022:全年净赚14亿,计划裁员1000人|雷报

2023-02-22

江苏泰兴:“梦想小屋”帮困境儿童圆梦|聚看点

2023-02-22

扶健华-资讯

2023-02-22

古代翻案有多困难呢?看看《雍正王朝》中的刘王氏遭遇就知道了_世界快播报

2023-02-22

不能被消化道直接吸收的物质-不能被消化道直接吸收的物质是

2023-02-21

信和置业公布2023财年中期权益分配方案|天天看点

2023-02-21

铜仁:治“林”护绿 守好生态底线

2023-02-21

当前聚焦:2023年全国计算机等级考试报名入口在哪

2023-02-21

养老年金保险是一种什么保险?养老年金保险优点与缺点有哪些?

2023-02-21

全球观速讯丨宫延楼蜜拓蜜的商品,虚假宣传?不可能!宫延楼用心做实业!

2023-02-21

世界播报:利民股份董秘回复:伊维菌素是新型的广谱、高效、低毒抗生素类抗寄生虫药

2023-02-21

无线路由器怎么用_家用无线路由器怎么安装

2023-02-21

智利中南部森林火灾已造成约44.1万公顷森林被毁 焦点快报

2023-02-21

“广州设计”服务横琴,这项市政工程获“最高质量水平评价”-焦点热门

2023-02-20

世界速讯:【春耕行动】呼和浩特:科技育种助春耕

2023-02-20

环球热资讯!黄山市黄山区供电公司:夯实现场教育 为基层党员注入“廉动力”

2023-02-20

全球聚焦:黎明觉醒生机和明日之后区别

2023-02-20

《又见敦煌》 终于“又见”

2023-02-20

环球看热讯:被反呛的陈老师也是有贡献的

2023-02-20

鸟笼婚姻全cg_鸟笼婚姻cg网盘

2023-02-20

中国—中东欧(沧州)中小企业合作区首家公用型保税仓库获批设立

2023-02-20

美国前总统吉米·卡特将开始接受临终关怀

2023-02-19

山东欧圣兰廷置业发展有限公司

2023-02-19

感冒了多喝热水能自愈吗_感冒了多喝热水有用吗_全球关注

2023-02-19

环球微资讯!dm500刷机教程_dm500

2023-02-19

宽带查询_宽带查询

2023-02-19

概述可持续发展观 论述可持续发展的内容

2023-02-19

安贫乐道的节目视频_安贫乐道-天天快资讯

2023-02-18

当前热门:【最新】珀尔修斯泰坦杀手修改器怎么安装(怎么用)无限生命,无限法力等

2023-02-18

关于山东鲁能的中性名不出意外会以山东泰山来提交新赛季注册名称|焦点消息

2023-02-18

打击网络谣言、共建清朗家园,中国互联网联合辟谣平台2023年1月辟谣榜-天天热点评

2023-02-18

复宏汉霖与国药控股达成深化合作 今日聚焦

2023-02-18

看热讯:威马沈晖回应“黄牛刷单”:确实遇到一些困难,全力保障复工复产

2023-02-18

农家团宠娇娇女糖宝杨德文_农家团宠娇娇女

2023-02-18

农民增收一口清 基层治理一网兜 绿美建设一直抓|东升村的“幸福果”|世界观天下

2023-02-18

世界时讯:福建迎来首个入境旅游团 港客开启“2023乐活厦门游”

2023-02-17

为周星驰配音的是谁啊_为周星驰配音的是谁

2023-02-17

免费好用OCR软件图片文字识别还能翻译

2023-02-17

扬州石塔-天天快资讯

2023-02-17

速递!2月17日新股提示:润普食品申购 亚通精工等上市

2023-02-17

智能自控:公司产品可广泛应用于光伏、锂电池等新能源行业-今日热讯

2023-02-17

WeWork2022年净亏损22.95亿美元,亏损收窄

2023-02-17

中科星图02月16日被沪股通减持5.88万股-信息

2023-02-17

慧荣发布新款PCIe 4.0 SSD主控SM2268XT

2023-02-17

河南省唐河县是哪个市|每日视点

2023-02-16

迷你世界怎么做电梯流程_迷你世界怎么做电梯-每日短讯

2023-02-16

全球微动态丨广州增城丝苗米稻田公园地址在哪里(附交通指南)

2023-02-16

每日速递:德方纳米(300769)2月16日主力资金净卖出6325.13万元

2023-02-16

atm日累计取款限额 每日关注

2023-02-16

团结奋斗 忠诚履职丨提高社区养老服务可及性|环球要闻

2023-02-16

一斤杨梅泡几斤白酒 环球视讯

2023-02-16

港股汽车股走强 蔚来涨超4%-环球今头条

2023-02-16

连接apple id服务器时出错怎么解决?-系统之家

2023-02-16

美政客为大选操弄“禁止中国买地”,专家:势必阻滞中企在美投资意愿 环球新要闻

2023-02-16

until的用法总结_until的用法

2023-02-16

当前聚焦:乐谱的结尾处有一细一粗的两条竖线叫什么_乐谱的结尾处有一细一粗的两条竖线

2023-02-16

penryn架构_penryn

2023-02-16

环球资讯:“涉黄”小卡片一旦参与,人财两空

2023-02-15

家里吉位怎么确定 实时焦点

2023-02-15

亨德森:利物浦朝正确方向迈了一步 会以德比胜利为基础继续前进 今日精选

2023-02-15

如何阻止垃圾短信 怎么防止手机上的垃圾短信

2023-02-15

追梦:防守很无趣全靠意志力 想赢就必须得这么做但我们没有

2023-02-15

abc是什么银行

2023-02-15