RabbitMq TTL+死信队列 延迟消息问题记录 - 行业动态 -

当前位置:首页  >  行业动态  > 正文

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

RabbitMq TTL+死信队列 延迟消息问题记录
2023-02-28 10:07:02 来源:腾讯云

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


(资料图)

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

(责任编辑:news01)
每日精选:人工智能拓展生活应用新场景(网上中国)

每日精选:人工智能拓展生活应用新场景(网上中国)

在河北省石家庄市井陉县一所职业技术教育中心,学生进行人工智能机器人调试学习。张晓峰摄(人民图片)...
02-22 07:12:11
首日1-1平!郑钦文靠实力硬压,状态渐入佳境,王欣瑜吞隐形蛋|每日短讯

首日1-1平!郑钦文靠实力硬压,状态渐入佳境,王欣瑜吞隐形蛋|每日短讯

球迷对比利简金杯赛郑钦文的首秀期待已久,她的对手波托奇尼克世界排名仅仅200名外开,与郑钦文有较大实...
02-22 02:40:21
立讯精密: 2021年股票期权激励计划首次授予人员名单(调整后)

立讯精密: 2021年股票期权激励计划首次授予人员名单(调整后)

立讯精密:2021年股票期权激励计划首次授予人员名单(调整后)
02-21 22:34:22
世界最大级别绿色环保型集装箱船在江苏出江试航_观焦点

世界最大级别绿色环保型集装箱船在江苏出江试航_观焦点

世界最大级别绿色环保型集装箱船在江苏出江试航---中新网南京2月21日电在江苏海事局海巡艇维护下,2 4...
02-21 19:43:41
每日时讯!新一轮计价周期刚开启,国内油价或将下调

每日时讯!新一轮计价周期刚开启,国内油价或将下调

今天是2023年2月21日,星期二,在大家关心的成品油价方面,新一轮计价统计周期已经开启,虽说上一轮调价...
02-21 18:05:58
特朗普:我胜选当晚要给普京和泽连斯基打电话,24小时内解决冲突 今日视点

特朗普:我胜选当晚要给普京和泽连斯基打电话,24小时内解决冲突 今日视点

(观察者网讯)“胜选当晚,我要给普京和泽连斯基打电话,我们将在24小时内达成协议。”据美国“佛罗里...
02-21 16:15:20
慈善主播发钱后又收回?多条视频或系“导演”,有地方正调查 焦点速读

慈善主播发钱后又收回?多条视频或系“导演”,有地方正调查 焦点速读

视频中,博主称肖婆婆和孙女住在这间破旧的房屋中。实际上,肖婆婆的家是这样的。视频中,博主称肖婆婆...
02-21 14:46:39
贝弗利首谈加盟公牛:两年内换队7次略悲凉 11年生涯共赚8200万|天天速讯

贝弗利首谈加盟公牛:两年内换队7次略悲凉 11年生涯共赚8200万|天天速讯

贝弗利首谈加盟公牛:两年内换队7次略悲凉11年生涯共赚8200万,公牛,湖人,快船队,奥兰多魔术,孟菲斯灰熊...
02-21 12:02:52
颐海国际(01579.HK)早盘再跌超4%,月内累计跌幅接近20%

颐海国际(01579.HK)早盘再跌超4%,月内累计跌幅接近20%

颐海国际(01579 HK)早盘再跌超4%,月内累计跌幅接近20%。截至发稿,跌4 28%,报22 35港元,成交额1964 33万港元。
02-21 10:08:08
【开好局 起好步】各地优化营商环境 激发市场主体活力

【开好局 起好步】各地优化营商环境 激发市场主体活力

央视网消息(新闻联播):新一年,各地推出一系列改革举措,积极打造高效便捷、公平有序的营商环境,持...
02-21 08:52:34
苹果手机屏幕晃动_苹果手机屏幕划不动是什么原因 每日头条

苹果手机屏幕晃动_苹果手机屏幕划不动是什么原因 每日头条

1、强制关机:同时长按Power(电源键 开关机键)+Home键,等出现黑屏之后松开Home键,白色苹果Lo
02-21 05:47:02
九连环简单易懂教程_九连环简单易懂的解法_环球新资讯

九连环简单易懂教程_九连环简单易懂的解法_环球新资讯

一个九连环如下图所示,九连环是由九个环通过九根杆相连,套在一个手柄上而组成的,将手柄从环中取出就...
02-21 00:56:00
大涨近10%!电解铝减产预期再起,中国宏桥有望顺势突围

大涨近10%!电解铝减产预期再起,中国宏桥有望顺势突围

大涨近10%!电解铝减产预期再起,中国宏桥有望顺势突围,港股,铝业,铝价,电解铝,上市公司,中国宏桥集团
02-20 21:04:23
春分能不能种白菜 春分能种白菜吗

春分能不能种白菜 春分能种白菜吗

1、春分能种白菜。2、春分白菜的生长过程均在春雨和梅雨季节里,栽培时间又短,所以定植前要施足基肥,...
02-20 18:52:47
快扔掉这3款初夏拖鞋吧!又土又丑就算了,还一股爆款“廉价感”

快扔掉这3款初夏拖鞋吧!又土又丑就算了,还一股爆款“廉价感”

初夏已经到来,天气也越来越炎热起来了,想必不少怕热的小伙伴们已经迫不及待换上了夏装和拖鞋了。毕竟...
02-20 16:47:51
环球快资讯丨激浊扬清的读法

环球快资讯丨激浊扬清的读法

一、关于激浊扬清的读法1、读法:[jīzhuóyángqīng]二、关于激浊扬清的释义2、基础释义:激:冲去;
02-20 14:44:27
足球报:陈戌源曾劝李铁退还武汉长江 4800 万遭拒绝

足球报:陈戌源曾劝李铁退还武汉长江 4800 万遭拒绝

@足球报官方微博消息,陈戌源曾劝李铁退还武汉长江4800万遭拒绝。李铁上任国足主帅后,武汉卓尔俱乐部仍...
02-20 12:17:43
昊华科技2月20日快速上涨 焦点热闻

昊华科技2月20日快速上涨 焦点热闻

以下是昊华科技在北京时间2月20日10:33分盘口异动快照:2月20日,昊华科技盘中快速上涨,5分钟内涨幅超...
02-20 10:24:42
6月轿车销量出炉:长安反超吉利,北汽爆出黑马,第一名不是朗逸_世界快消息

6月轿车销量出炉:长安反超吉利,北汽爆出黑马,第一名不是朗逸_世界快消息

导读:近日,国内市场6月份轿车销量出炉:长安反超吉利,日产轩逸破4万,北汽爆出一匹黑马!下面就让我...
02-20 08:45:39
一汽解放电脑版_一汽解放卡车电子目录

一汽解放电脑版_一汽解放卡车电子目录

1、只有一汽内部有密码别人进不去的 。本文分享完毕,希望对大家
02-20 05:52:36
古巴专家:破坏“北溪”管道 美国获益最大

古巴专家:破坏“北溪”管道 美国获益最大

近日,古巴国际政治研究中心美国问题专家尼尔森·罗格在接受中央广播电视总台记者采访时表示,“北溪”...
02-20 00:58:46
走进区域看发展|巴山渝水显神韵 数字技术驱动河流治理 短讯

走进区域看发展|巴山渝水显神韵 数字技术驱动河流治理 短讯

“千里嘉陵江水色,含烟带月碧于蓝。”唐代诗人李商隐寥寥几笔,便将月光照射之下,嘉陵江水雾弥漫、江...
02-19 21:08:22
【天天播资讯】qq怎么设置语音转文字_qq语音转文字

【天天播资讯】qq怎么设置语音转文字_qq语音转文字

1、有时我们在使用qq时,希望将语音设置为文本。怎么设置?下面分享一下方法。2、第一步,打开手机qq侧...
02-19 17:44:41
株洲市二中青龙湾小学低年级“识字大王”诞生

株洲市二中青龙湾小学低年级“识字大王”诞生

红网时刻新闻2月19日讯(通讯员杨莹)汉字是阅读和写作的基础,是语文学习的必修课。为夯实语文学习基础...
02-19 14:43:48
电脑开机键盘灯不亮鼠标灯亮_电脑开机键盘灯不亮 当前最新

电脑开机键盘灯不亮鼠标灯亮_电脑开机键盘灯不亮 当前最新

1、第一步:打开电脑机箱的侧面板后,拔出内存条,然后将内存条重新安装到内存条插槽中。如果不工作,将...
02-19 11:55:16
人生就是三和七

人生就是三和七

▼点击下方卡片关注我们风水改运智慧点击【关注】,天天精彩阅读!公众号流年似水,人生已过半。为人处...
02-19 09:02:36
环球视讯!你能种一棵砍下来的圣诞树吗?

环球视讯!你能种一棵砍下来的圣诞树吗?

树干在树顶被砍掉后会长出树枝,因为它们仍然有根来提供水分和养分。砍掉的圣诞树不能重新生根。如果种...
02-19 06:02:40
焦点要闻:“炫技”小伙深夜驾驶电动车上演“杂技”

焦点要闻:“炫技”小伙深夜驾驶电动车上演“杂技”

近日一段“抖音”里的视频引起扬州警方关注,视频中,一年轻小伙深夜驾驶一辆白色踏板式电动车,行驶在...
02-19 00:59:22
qq会员图标怎么设置_qq会员图标怎么设置方法-每日资讯

qq会员图标怎么设置_qq会员图标怎么设置方法-每日资讯

1、打开QQ,进入设置界面。在封面管理器中,将显示QQ成员图标。具体操作方法如下:2、单击主菜单。3、单...
02-18 20:50:42
每日关注!扬州逸海营销策划有限公司

每日关注!扬州逸海营销策划有限公司

1、扬州逸海营销策划有限公司是以营销策划、建材团购、旅游策划为主营业务的有限公司。本文到此分享完毕...
02-18 18:06:03

为您推荐

精彩推送