天天视点!RabbitMq TTL+死信队列 延迟消息问题记录
延迟队列存储的对象是对应的延迟消息,所谓的延迟消息是指当消息被发送以后,并不想让消费者立刻拿到消息,而是等待特定时间后,消费者才能拿到这个消息进行消费
利用RabbitMq
的TTL
和死信队列 来实现延时消费。
(资料图)
如果设置的是队列统一过期时间放到死信队列,没有什么问题。
如果是延时时间设置到每条消息上的。而不是给队列的。
实现方式为消息存活时间为动态用户页面可配置的。
这就导致了一个问题:
先用一条消息的存活时间是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界面新建交换机选择类型出现红框标注即表示成功
代码实现
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-24
-
逛景区、品美食、看表演,武汉新洲花朝河湾花朝节来了
极目新闻 2023-02-23
-
排队跳水!这36万股民要慌?_天天看点
东方财富研究中心 2023-02-23
-
环球最资讯丨皇明太阳能怎么样用热水洗澡_皇明太阳能怎么样
互联网 2023-02-23
-
800V火了,但你更应知道充电桩的“功率达成率”
电动湃 2023-02-23
-
“电子竞技员”技能考试公布成绩 电竞人才成长通道将逐渐拓宽-环球快播
澎湃新闻 2023-02-23
-
当前快讯:九江市应考公务员人数首次突破两万人大关
九江新闻网 2023-02-23
-
俄副外长:俄方停止参与《新削减战略武器条约》不会导致相关方接近核战争
南财快讯 2023-02-23
-
2022年新能源车销量近30%了,为何到今年大家还坚持开燃油车?|全球观速讯
阿贵看车 2023-02-23
-
涉嫌逃税8.7亿欧元,意大利检方立案调查脸书母公司Meta-当前热讯
互联网 2023-02-23
-
天天视点!RabbitMq TTL+死信队列 延迟消息问题记录
腾讯云 2023-02-24
-
逛景区、品美食、看表演,武汉新洲花朝河湾花朝节来了
极目新闻 2023-02-23
-
排队跳水!这36万股民要慌?_天天看点
东方财富研究中心 2023-02-23
-
环球最资讯丨皇明太阳能怎么样用热水洗澡_皇明太阳能怎么样
互联网 2023-02-23
-
800V火了,但你更应知道充电桩的“功率达成率”
电动湃 2023-02-23
-
“电子竞技员”技能考试公布成绩 电竞人才成长通道将逐渐拓宽-环球快播
澎湃新闻 2023-02-23
-
当前快讯:九江市应考公务员人数首次突破两万人大关
九江新闻网 2023-02-23
-
俄副外长:俄方停止参与《新削减战略武器条约》不会导致相关方接近核战争
南财快讯 2023-02-23
-
2022年新能源车销量近30%了,为何到今年大家还坚持开燃油车?|全球观速讯
阿贵看车 2023-02-23
-
涉嫌逃税8.7亿欧元,意大利检方立案调查脸书母公司Meta-当前热讯
互联网 2023-02-23
-
上海保华国际广场资产21.7亿元挂牌拍卖,此前已两次流拍
澎湃新闻 2023-02-22
-
最新快讯!2022年01月10日整理发布:php怎么设置状态码
元宇宙网 2023-02-22
-
每日快报!日本想同时对中俄下手,关键时刻菲律宾或反水,中俄将不会客气
前卫新视角 2023-02-22
-
库明加晒返工照 一哥留言:最后那张图的高尔夫球场在哪儿?_天天热文
直播吧 2023-02-22
-
创世纪董秘回复:“台群”作为公司核心商标
证券之星 2023-02-22
-
环球微动态丨新疆接羔育幼工作进入高峰期 多措并举兜底牧民“钱袋子”
央视网 2023-02-22
-
天天实时:陕f是哪里的车牌
互联网 2023-02-22
-
【Crush·迷恋】E10-1. 如斯温柔(主金泰亨/中篇连载)-环球速讯
哔哩哔哩 2023-02-22
-
全球实时:多彩非遗 美丽乡村 二月二赶八岩“瑶牯圩”
恭城瑶族自治县门户网 2023-02-21
-
国芯科技(688262.SH)股东西藏泰达以多种方式累计减持3.09%股份 环球热讯
智通财经 2023-02-21
-
全球简讯:石家庄强力推进“6+2+2”城市更新重点项目建设
河北日报 2023-02-21
-
飞鹤折了“高价”翅膀 资讯
智瑾财经 2023-02-21
-
当前快讯:科技赋能多维创新 元保保险经纪带动行业高质量发展
证券之星 2023-02-21
-
均胜电子:公司汽车电子和汽车安全产品均可应用在智能网联汽车上|热议
证券时报网 2023-02-21
-
2022年度南京市垃圾分类志愿者“年度之星”出炉-当前简讯
南报网 2023-02-21
-
色组词有哪些的组词_全球新动态
互联网 2023-02-21
-
当前热门:在我国交通事故误工费多久
法师兄 2023-02-21
-
全球速递!站在门口的圪梁梁上,守望石油,守望你…
铁人先锋 2023-02-20
-
资讯推荐:合肥甲醛检测机构有哪些_合肥甲醛检测机构
互联网 2023-02-20
-
原告不到庭要求上诉离婚怎么办
法师兄 2023-02-20