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
- 国家移民管理局暂停签发韩国、日本公民来华口岸签证及72/144小时过境免签-环球滚动
- 港股异动 | 药明生物(02269)升7% 近三月北水增仓超5个百分点 机构料全年业绩持续高增
- 当前快报:美国小企业乐观度降至近十年来倒数第二
- 英文爱情的句子唯美句子大全(精选259句)
- 粤港澳大湾区中小企业报告:逾6成中小企业预期2023年将投放可观资金于大湾区_天天热文
- 山西泽州警方摧毁省级目标贩毒网络 17名毒贩累计贩毒超30公斤 今日热门
- 安逸花网贷8万逾期还不起我会不会被起诉 全球快播
- 有意思小周刊(2023.01.09):一文详解|影响成长的关键思考_世界消息
- 当前要闻:电子车牌板块1月9日跌0.11%,易华录领跌,主力资金净流出6738.9万元
- 省呗网贷逾期14年多久会上征信
-
交通运输部:加快建设交通强国-世界微动态
央视网消息(新闻联播):交通运输部相关负责人今天(2月23日)在“权威部门话开局”系列主题新闻发布会上表示,今年将加快交通强国建设,并制
-
俄罗斯常驻联合国代表:俄欧关系本质上已不存在-当前热文
当地时间2月23日,俄罗斯常驻联合国代表涅边贾就俄欧关系表示,俄罗斯与欧盟间的关系本质上已经不复存在,欧盟内部在讨论如何更好地分裂和摧毁
-
世界微资讯!非常有张力的变形金刚超能勇士角色插画
超能勇士是变形金刚G1动画的续集,其中的角色变身之后不在是车形载具而是各种野兽形态。原本的野兽形态看起来比较正常,插画中的造型可以说张
-
【ES三周年】2 万字长文,带你深入理解 Elasticsearch 天天速递
项目中我们总是用Kibana界面来搜索测试或生产环境下的日志,来看下有没有异常信息。Kibana就是我们常说的ELK中的K。
-
男子入室盗窃惊醒房主竟将其掐死,潜逃10年后落网一审被判死刑
男子入室盗窃惊醒房主竟将其掐死,潜逃10年后落网一审被判死刑
-
郝氏控股二次递表港交所 年收入上亿元仅36名雇员 环球快讯
2月22日,郝氏控股有限公司(以下简称郝氏控股)向港交所主板提交上市申请书,此前,公司曾于2021年7月份提交过上市申请。据了解,郝氏控股是一
-
天天播报:智能电视怎么看直播_智能电视怎么看直播
1 首先打开电视和机顶盒,然后进入电视页面首页,从首页切换到应用。2 在应用程序中输入应用程序。如果没有,可以先安装。3
-
兰州新区“链式招商”取得新突破_快讯
兰州新区深入贯彻落实“三抓三促”行动要求,抢抓时机、主动出击,紧盯“中字头”“国字号”“500强”、上市公司、行业龙头等“大块头”企业投
-
巨人城废墟手游加特林放哪里,巨人城废墟中的火神加特林如何使用 热点聚焦
本文目录一览1,巨人城废墟中的火神加特林如何使用2,cf巨人城废墟怎么卡火神加特林今天看到有人把他拆了下来3,巨人城废墟加特林怎么下4,CF
-
赋能美业,助推健康中国 | 金生缘总经理黄莹女士担任中美协会转型升级专委会主任
赋能美业,助推健康中国|金生缘总经理黄莹女士担任中美协会转型升级专委会主任
X 关闭
RabbitMq TTL+死信队列 延迟消息问题记录_今日要闻
快消息!美国股市24日全面收跌,债券收益率继续攀升
第十七届全球华语榜中榜|环球热头条
设置多年经验告诉我,屋顶做防水要这样处理,才能确保施工好不渗水-世界热资讯
可爱颂的中文歌词_可爱颂的中文歌词
X 关闭
得知西安疫情防控“升级” 男子夜骑共享单车回咸阳淳化
中国医生将任SIU主席背后:从追随者同行者到引领者
海南省通报政法队伍教育整顿成果
云南两地发现核酸阳性人员 西安实行最严格的社会面管控
广东梅州大埔中央红色交通线沿线发现多株百岁古树