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

本文相关推荐

第三届江苏省知识产权系统法律知识竞赛落幕_观天下

第三届江苏省知识产权系统法律知识竞赛落幕

11月26日 16:23 要闻

11月26日生意社大豆油基准价为8342.00元/吨 精选

11月26日,生意社大豆油基准价为8342 00元 吨,与本月初(8322 00元 吨)

11月26日 16:10 热点

特斯联投资成立机器人科技新公司

近日,嘉兴特跃机器人科技有限公司成立,注册资本1000万元,经营范围包

11月26日 14:17 资讯

今日热文:7天Shibor报1.4530% 上涨2.00个基点

金吾财讯|11月26日,隔夜Shibor报1 3160%,无涨跌;7天Shibor报1 4530%

11月26日 14:07 快讯

大唐新能源10月发电量同比下降14.39% 风电承压 光伏强势增长

11月25日,大唐新能源(01798)发布公告,2025年10月本公司及其附属公司

11月26日 14:11 要闻

南网数字:公司传感器产品具体情况参见招股说明书-焦点热讯

此页面是否是列表页或首页?未找到合适正文内容。

11月26日 12:27 要闻

孤雨下午(11.26)主要商品操作建议 今头条

沪铜2601  下午86350-86550附近逢低择机轻仓低接  多单于86600-869

11月26日 12:04 热点

首批“月壤砖”完成太空实验返回 未来可能就是“广寒宫”

首批“月壤砖”完成太空实验返回,状态良好经过为期一年的舱外暴露实验

11月26日 11:02 要闻

当前看点!上班不请假,周末游襄阳 唐城汉服巡游等你来

楚天都市报极目新闻讯(记者邬晓芳通讯员何梦琴)11月22日,围绕“上班

11月26日 09:19 热点

惠普盈利展望不及市场预期 宣布将裁员4000至6000人

惠普盈利展望不及市场预期宣布将裁员4000至6000人

11月26日 08:30 快讯

5G-A规模商用有序推进,覆盖超300个城市

工业和信息化部近日组织开展2025年度5G应用“扬帆”行动重点城市总结评

11月26日 08:15 要闻

尿酸企业如何(2025/11/25)|播报

据南方财富网概念库数据显示,尿酸企业有:亿帆医药:2024年报显示,公

11月26日 08:07 热点

黑龙江省鸿业农业机械服务有限公司成立 注册资本3万人民币|焦点

天眼查App显示,近日,黑龙江省鸿业农业机械服务有限公司成立,法定代

11月26日 07:00 快讯

美国9月PPI年率2.7% 美国9月PPI月率0.3% 动态

美国9月PPI年率2 7%,预期2 7%,前值2 6%。美国9月PPI月率0 3%,预期0

11月25日 22:02 热点

快报:因知识产权与竞争纠纷,贵州茅台起诉李电辉

天眼查APP显示,近日,贵州茅台酒股份有限公司新增一则开庭公告,案由

11月25日 20:55 快讯

今日热搜:林皇猖狂老蒯凶猛!海港1-3首尔 维塔尔世界波,颜骏凌坐实射正王

林皇猖狂老蒯凶猛!海港1-3首尔维塔尔世界波,颜骏凌坐实射正王,海港,

11月25日 20:22 要闻

富士莱:瑞玞生物主要业务为医疗器械和化妆品系列医美产品的研发、生产和销售

证券日报网讯富士莱(301258)11月25日在互动平台回答投资者提问时表示

11月25日 20:26 热点

外交部:高市早苗的错误涉台言论恶化中日交流氛围 前沿资讯

11月25日,外交部发言人毛宁主持例行记者会。有记者就中日交流合作受到

11月25日 18:16 快讯

【焦点热闻】科蓝软件: 关于变更持续督导保荐代表人的公告内容摘要

北京科蓝软件系统股份有限公司于近日收到中信建投证券股份有限公司出具

11月25日 18:05 要闻

光纤激光器龙头,相关概念上市公司有哪些?(2025/11/25) 每日速讯

据南方财富网概念查询工具数据显示,光纤激光器上市龙头企业有:杰普特

11月25日 17:09 快讯

最新资讯:四中全会精神在基层丨钢与火的新生:沈阳1905文化创意园的焕新答卷

当钢花褪去炽热,老厂房迎来文创的星光,沈阳铁西,这片曾经书写中国工

11月25日 14:20 快讯

最资讯丨生意社:11月25日山东地区异辛醇行情上涨

据生意社商品分析系统:11月25日山东异辛醇市场均价为6283 33元 吨,较

11月25日 14:09 要闻

2025年11月25日达州市复兴市场管理有限责任公司价格行情 每日资讯

2025年11月25日达州市复兴市场管理有限责任公司价格行情

11月25日 13:12 资讯

每日观察!储蓄型保险和保障型有何差异?

在保险市场中,储蓄型保险和保障型保险是两种常见的类型,它们各自具有

11月25日 13:04 快讯

[快讯]红太阳12166万限售股11月27日解禁-视点

CFi CN讯:红太阳(股票代码:000525)在2025年11月27日新增可售A股121

11月25日 12:22 热点

区县动态丨南明区四项教育创新成果在全国教博会展示推广

贵阳网·贵阳新闻讯11月15日至17日,由北京师范大学主办的第七届中国教

11月25日 11:16 热点

龙蟠科技早盘大涨超25% 与楚能新能源签署补充协议二

龙蟠科技早盘大涨超25%与楚能新能源签署补充协议二

11月25日 10:33 要闻

人民银行开展3021亿元逆回购操作

人民银行开展3021亿元逆回购操作。

11月25日 10:14 热点

每日报道:韩国“国民爷爷”李顺载去世,终年91岁,代表作《搞笑一家人》

韩国“国民爷爷”李顺载去世,终年91岁,代表作《搞笑一家人》

11月25日 09:31 资讯

深信服:11月24日持仓该股ETF资金净流入1217.49万元,3日累计净流入8463.33万元

据同花顺(300033)iFind,深信服(300454)11月24日ETF资金当日净流入

11月25日 09:26 快讯