当前位置: 首页 > news >正文

RabbitMQ(高阶使用)死信队列

文章内容是学习过程中的知识总结,如有纰漏,欢迎指正

文章目录

一、什么是死信队列?

二、死信队列使用场景

三、死信队列如何使用

四、打车超时处理

 1.打车超时实现


以下是本篇文章正文内容

一、什么是死信队列?

        先从概念解释上搞清楚这个定义,死信,顾名思义就是无法被消费的消息,字面意思可以这样理解

        一般来说,producer将消息投递到broker或者直接到queue里了,consumer从queue取出消息进行消费,但某些时候由于特定的原因导致queue中的某些消息无法被消费,这样的消息如果没有后续的处理,就变成了死信,有死信,自然就有了死信队列;

二、死信队列使用场景

RabbitMQ中的死信交换器(dead letter exchange)可以接收下面三种场景中的消息:

  • 消费者对消息使用了basicReject或者basicNack回复,并且requeue参数设置为false,即不再将该消息重新在消费者间进行投递
  • 消息在队列中超时,RabbitMQ可以在单个消息或者队列中设置TTL(最大存活时间)属性
  • 队列中的消息已经超过其设置的最大消息个数

三、死信队列如何使用

        死信交换器不是默认的设置,这里是被投递消息被拒绝后的一个可选行为,是在创建队列的时进行声明的,往往用在对问题消息的诊断上。

        死信交换器仍然只是一个普通的交换器,创建时并没有特别要求和操作,在创建队列的时候,声明该交换器将用作保存被拒绝的消息即可,相关的参数是x-dead-letter-exchange。     

   相关代码

@Bean
public Queue taxiOverQueue() {Map<String, Object> args = new HashMap<>(2);// x-dead-letter-exchange    这里声明当前队列绑定的死信交换机args.put("x-dead-letter-exchange", TAXI_DEAD_QUEUE_EXCHANGE);// x-dead-letter-routing-key  这里声明当前队列的死信路由keyargs.put("x-dead-letter-routing-key", TAXI_DEAD_KEY);return QueueBuilder.durable(TAXI_OVER_QUEUE).withArguments(args).build();
}

四、打车超时处理

        用户通过调用打车服务将数据放进RabbitMQ的死信队列进行延时操作,等待一段时间后,正常的业务处理还没有处理到我们发起的数据,将会进行超时处理,通过通知服务将我们的处理结构通过websocket方式推送到我们的客户端。

 1.打车超时实现

        在创建队列的时候配置死信交换器并设置队列的“x-message-ttl”属性。此时该属性为整个队列消息的生存时间,这里有一篇专门讲延时任务的文章。RabbitMQ(高阶使用)延时任务-CSDN博客

@Bean
public Queue taxiDeadQueue() {return new Queue(TAXI_DEAD_QUEUE,true);
}@Bean
public Queue taxiOverQueue() {Map<String, Object> args = new HashMap<>(2);// x-dead-letter-exchange    这里声明当前队列绑定的死信交换机args.put("x-dead-letter-exchange", TAXI_DEAD_QUEUE_EXCHANGE);// x-dead-letter-routing-key  这里声明当前队列的死信路由keyargs.put("x-dead-letter-routing-key", TAXI_DEAD_KEY);// x-message-ttl  声明队列的TTLargs.put("x-message-ttl", 30000);return QueueBuilder.durable(TAXI_OVER_QUEUE).withArguments(args).build();
}

这样所有被投递到该队列的消息都最多不会存活超过30s,超时后的消息会被投递到死信交换器

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【机器学习】9 ——最大熵模型的直观理解
  • 集群聊天服务器项目【C++】项目介绍和环境搭建
  • ego-planner开源代码之traj_server数据流分析
  • 如何用安卓玩Java版Minecraft,安卓手机安装我的世界Java版游戏的教程
  • 深入浅出通信原理
  • Renesas R7FA8D1BH (Cortex®-M85)控制ISLS29035
  • QT + WebAssembly + Vue环境搭建
  • eclipse使用 笔记02
  • 【Linux系统编程】用互斥量和信号量加锁STL容器,避免并发问题
  • 【鸿蒙OH-v5.0源码分析之 Linux Kernel 部分】005 - Kernel 入口 C 函数 start_kernel() 源码分析
  • 在linux下,找到指定命令对应的路径信息
  • MCN跨国企业如何从0到1搭建ITSM运维体系
  • MATLAB、FPGA、STM32中调用FFT计算频率、幅值及相位差
  • Spring 的循环依赖
  • MAC 地址简化概念(有线 MAC 地址、无线 MAC 地址、MAC 地址的随机化)
  • 网络传输文件的问题
  • 【知识碎片】第三方登录弹窗效果
  • go append函数以及写入
  • Idea+maven+scala构建包并在spark on yarn 运行
  • Linux快速复制或删除大量小文件
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • webpack入门学习手记(二)
  • FaaS 的简单实践
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​​​【收录 Hello 算法】9.4 小结
  • ​马来语翻译中文去哪比较好?
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • (06)金属布线——为半导体注入生命的连接
  • (day6) 319. 灯泡开关
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (LLM) 很笨
  • (定时器/计数器)中断系统(详解与使用)
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .gitignore文件_Git:.gitignore
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET 给NuGet包添加Readme
  • .NetCore部署微服务(二)
  • .NET是什么
  • 。Net下Windows服务程序开发疑惑
  • ::前边啥也没有
  • @JsonFormat与@DateTimeFormat注解的使用
  • @WebServiceClient注解,wsdlLocation 可配置
  • []利用定点式具实现:文件读取,完成不同进制之间的
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——
  • [AS3]URLLoader+URLRequest+JPGEncoder实现BitmapData图片数据保存
  • [Bugku] web-CTF靶场系列系列详解⑥!!!
  • [BZOJ 1040] 骑士
  • [BZOJ3211]:花神游历各国(小清新线段树)
  • [C++] cout、wcout无法正常输出中文字符问题的深入调查(1):各种编译器测试
  • [C++]四种方式求解最大子序列求和问题