延迟队列存储的对象是对应的延迟消息,所谓的延迟消息是指当消息被发送以后,并不想让消费者立刻拿到消息,而是等待特定时间后,消费者才能拿到这个消息进行消费
利用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
(责任编辑:黄俊飞)推荐内容
- 天天热议:RabbitMq TTL+死信队列 延迟
- 【独家焦点】2.5两的母蟹会不会太小了_母
- 鹗科
- 22 岁小伙不慎弄断手指,湘潭医生 4
- 欧联杯16强出炉:西甲德甲3队!意甲英超2
- “文言一心”首批合作伙伴科蓝软件受邀出
- 神户胜利船官方:伊涅斯塔因家庭事务返回
- 重庆奉节廉租房申请条件+材料+流程-世界
- 任务法卡组2023_任务法卡组
- 天天讯息:汉王科技:公司N10的墨水屏是
- 今日讯!啃书网_啃书网官网
- 押一付三_说一说押一付三的简介
- 汤姆猫(300459.SZ):正筹划定增募资、拟
- 百事通!石头晚评:2月24日期货操作建议
- 高密度纤维板与。木头
- 2月23日成都市场工角槽价格行情,今日裕
- 楚人有卖其珠于郑者的意思_楚人贻笑-看热
- 韩国都玩什么游戏,现在韩国人都玩什么手
- 2023汕头一模政治答案及试卷汇总!_更新
- 安全健康的北欧豪华中型轿车沃尔沃S60正
- 当前观察:聚合码怎么申请支付宝_聚合码
- 舶来品的东西好吗_舶来品和泊来品区别是
- 百合指的是什么人?
- 金诚信:拟不超1亿元收购Cordoba矿业子公
- 新浪彩票双色球名家第23020期推荐汇总|新
- 环球资讯:silanic_sinlang邮箱
- 世界速看:双氧水职业危害告知牌_双氧水
- 今年我国将创建1000个全国示范性老年友好
- 天天新动态:赤壁在哪里考电工证_赤壁在
- 粮安工程_关于粮安工程介绍|全球滚动
- 英雄无敌3作弊码怎么用_英雄无敌3作弊码
- 环球速看:白鸽离婚后完整视频_白鸽离婚
- 成南高速路况监控查询 全球热头条
- 扶余县水利志_天天快看点
- 网约车双证司机索要优先派单权?新一轮的
- 新人教版三年级数学上册教学计划与反思_
- 要闻速递:7.43亿投资!宜宾市第二生活垃
- 环球热讯:开城属于朝鲜还是韩国地图_开城
- 关系崩溃,往往是从这4种行为开始的|每日
- 全球观察:中海物业:杨鸥因工作调动辞任
- 文明校园新闻稿100字怎么写_文明校园新闻
- 佛山市龙翔大桥将于近期通车-天天快看
- 29款菜肴分享,荤素搭配营养更均衡,吃一
- 【世界独家】《雷霆沙赞!众神之怒》3月1
- 资讯推荐:怎么解除qq防沉迷_如何解除qq防
- 关键词扩充,自动生成文章,SEO,无限长
- 星链拟推出“全球漫游”互联网服务 月收
- 忘不了你给的微笑400字作文(共6篇)
- 世界资讯:关于安全生产的内容_安全生产
- 2023年2月20日涨停板早知道:七大利好有
- 看热讯:马牙槎_说一说马牙槎的简介
- 长安商场打折信息_南京商场打折信息_每日
- 今日播报!ChatGPT烧钱 训练一次过千万
- 30 万价位比増程更好的选择?试驾比亚迪
- 10只大天鹅歇脚房山-世界热门
- qq怎么借钱500元-前沿资讯
- 两部门推动南水北调工程受水区加强全面节
- 2023潍坊与东营一模生物试卷答案及其参考
- 2018最流行的女生头像青春可爱_2018最新
- 般若是什么花_般若是什么|每日消息
- 当前观察:聚合码怎么申请支付宝_聚合码
- 舶来品的东西好吗_舶来品和泊来品区别是
- 百合指的是什么人?
- 金诚信:拟不超1亿元收购Cordoba矿业子公
- 新浪彩票双色球名家第23020期推荐汇总|新
- 环球资讯:silanic_sinlang邮箱
- 世界速看:双氧水职业危害告知牌_双氧水
- 今年我国将创建1000个全国示范性老年友好
- 天天新动态:赤壁在哪里考电工证_赤壁在
- 粮安工程_关于粮安工程介绍|全球滚动
- 英雄无敌3作弊码怎么用_英雄无敌3作弊码
- 环球速看:白鸽离婚后完整视频_白鸽离婚
- 成南高速路况监控查询 全球热头条
- 扶余县水利志_天天快看点
- 网约车双证司机索要优先派单权?新一轮的
- 新人教版三年级数学上册教学计划与反思_
- 要闻速递:7.43亿投资!宜宾市第二生活垃
- 环球热讯:开城属于朝鲜还是韩国地图_开城
- 关系崩溃,往往是从这4种行为开始的|每日
- 全球观察:中海物业:杨鸥因工作调动辞任
- 文明校园新闻稿100字怎么写_文明校园新闻
- 佛山市龙翔大桥将于近期通车-天天快看
- 29款菜肴分享,荤素搭配营养更均衡,吃一
- 【世界独家】《雷霆沙赞!众神之怒》3月1
- 资讯推荐:怎么解除qq防沉迷_如何解除qq防
- 关键词扩充,自动生成文章,SEO,无限长
- 星链拟推出“全球漫游”互联网服务 月收
- 忘不了你给的微笑400字作文(共6篇)
- 世界资讯:关于安全生产的内容_安全生产
- 2023年2月20日涨停板早知道:七大利好有
- 看热讯:马牙槎_说一说马牙槎的简介
- 长安商场打折信息_南京商场打折信息_每日
- 今日播报!ChatGPT烧钱 训练一次过千万
- 30 万价位比増程更好的选择?试驾比亚迪
- 10只大天鹅歇脚房山-世界热门
- qq怎么借钱500元-前沿资讯
- 两部门推动南水北调工程受水区加强全面节
- 2023潍坊与东营一模生物试卷答案及其参考
- 2018最流行的女生头像青春可爱_2018最新
- 般若是什么花_般若是什么|每日消息
- 对特斯拉Model部分车型再涨2000元事件你
- Raclette 奶酪的替代品 全球快消息
- 每日精选:广西富川:让非遗在传承中“活
- 3.5折优惠:奔富前酿酒师出品,高性价比
- 一周为民办事丨生育津贴如何申领?长沙县
- 最高检:全国检察机关共开展监狱巡回检察
- 讯息:越南旅游着_越南旅游禁忌
- 当前热点-经典音乐:一曲《当春天来临》
- 中辉期货宏观早报:美欧央行表态持续偏鹰
- 东阿阿胶:2月16日融券卖出金额1153.03万
- 合同的履行方式是什么?
- 当前热门:杰拉德华莱士集锦_杰拉德华莱士
- 全球速读:突发!这国发现不明导弹残骸,
- 快资讯丨杭州市政府与吉利控股签署战略合
- 中国游客改变日本:09年只有11.8%日本人
- 安布罗斯伊利亚特|环球观点
- 卡纸手工制作吊饰_彩色卡纸手工制作贴画_
- 杭州又有一批交通工程迎来新进展
- 世界热点评!国家级农机计量测试服务机构
- 天天即时:大埔在哪里