RabbitMQ实践——超时消息的处理方法

news2024/11/24 0:24:10

大纲

  • 准备工作
  • 整个队列的消息都有相同的时效性
    • 抛弃超时消息
      • 新建带x-message-ttl的队列
      • 新建绑定关系
      • 实验
    • 超时消息路由到死信队列
      • 新建带死信和ttl的队列
      • 新建绑定关系
      • 实验
  • 消息指定自己的超时时间
    • 新建带死信的队列
    • 绑定
    • 实验
  • 消息自带TTL和队列TTL的关系
    • 消息TTL < 队列指定TTL
    • 消息TTL > 队列指定TTL
    • 总结

在项目中,我们往往会遇到消息具有时效性:在一定时间内的消息需要处理,其他消息则不用处理。RabbitMQ提供了两种功能来满足这种需求:

  • 整个队列的消息都有相同的时效性。
  • 消息可以指定自己的超时时间。

对于超时的消息,我们可以选择抛弃,或者让其进入死信。本文我们将实验这些场景。

准备工作

我们先新建一个交换器direct.ttl。后续不同场景我们再设定其不同路由。
在这里插入图片描述
然后再创建一个死信队列queue.dead.letter
在这里插入图片描述
最后新建交换器direct.ttl和队列queue.dead.letter的路由绑定关系
在这里插入图片描述

后续我们将根据不同场景新建不同的队列和绑定关系。

整个队列的消息都有相同的时效性

抛弃超时消息

新建带x-message-ttl的队列

如果队列设置了x-message-ttl,则其全部消息的最大ttl就是其值。它的单位是毫秒。下图中,队列消息如果30秒没有处理,就会从队列中移除。
在这里插入图片描述

新建绑定关系

我们让交换器中Routing key是to.queue.all.message.ttl的消息路由到上面创建的队列中。
在这里插入图片描述

实验

向该交换器发送一条消息
在这里插入图片描述
消息出现在队列queue.all.message.ttl中。
在这里插入图片描述
半分钟后,该条消息从队列中消失。
在这里插入图片描述

超时消息路由到死信队列

不同于上例,只是设置了x-message-ttl,还要设置死信相关参数。本例我们将使用“重写Routing key”的方案,节省一次交换器的创建。

新建带死信和ttl的队列

新建名字是queue.all.msg.ttl.dead.letter的队列。这个队列中的所有消息的最大超时时间(x-message-ttl)是30秒;超时消息会被修改Routing key为to.queue.dead.letter后,使用direct.ttl交换器来路由。
在这里插入图片描述

新建绑定关系

将这个队列和之前新建的交换器direct.ttl关联。
在这里插入图片描述

实验

在这里插入图片描述
在这里插入图片描述
可以看到消息在过了30秒后,被从原来的队列queue.all.msg.ttl.dead.letter中移除,然后路由到死信队列queue.dead.letter中。
在这里插入图片描述

消息指定自己的超时时间

本例我们只实验相对复杂的场景,即将超时消息路由到死信。

新建带死信的队列

这个队列我们没有设置ttl相关数据,只是设置了死信相关配置:死信消息交由交换器direct.ttl处理,其Routing key被修改成to.queue.dead.letter。
在这里插入图片描述

绑定

在这里插入图片描述

实验

这次我们不能使用后台来发送消息,而是通过Java代码来发送。

public void sendWithTTL(String exchangeName, String routingKey, String message, int ttl) {
    String msgId = UUID.randomUUID().toString();
    Message msg = MessageBuilder.withBody(message.getBytes())
            .setContentType("text/plain")
            .setCorrelationId(msgId)
            .setMessageId(msgId)
            .setExpiration(String.valueOf(ttl))
            .build();

    CorrelationData correlationData = new CorrelationData(msgId);
    rabbitTemplateWithoutMandatory.convertAndSend(exchangeName, routingKey, msg, correlationData);
}

发送消息时我们只需要给消息增加setExpiration调用即可。它的单位是毫秒,需要转换为字符串。
在这里插入图片描述
在这里插入图片描述
可以看到20秒后,消息从queue.with.dead.letter队列进入queue.dead.letter队列。
在这里插入图片描述
在这里插入图片描述

消息自带TTL和队列TTL的关系

如果一个自带TTL的消息被路由到一个所有消息都被队列指定TTL的队列上,那么哪个TTL生效呢?
我们用第二个案例的接口,给第一个案例的队列发送一个自带TTL的消息。

消息TTL < 队列指定TTL

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
可以看到消息在20秒时就进入了死信。

消息TTL > 队列指定TTL

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到消息在30秒时就进入了死信。

总结

如果队列指定TTL,消息也设置了TTL,取最接近当前时间的TTL。即用最短的那一个。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1841003.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vxe-table 列表过滤踩坑_vxe-table筛选

但是这个过滤输入值必须是跟列表的值必须一致才能查到&#xff0c;没做到模糊查询的功能&#xff0c;根据关键字来过滤并没有实现。 下面提供一下具体实现方法&#xff1a;&#xff08;关键字来过滤&#xff09; filterNameMethod({ option, row }) {if (row.name.indexOf(op…

Vue65-vue-resource:ajax请求

vue-resource是vue的插件库&#xff0c;用vue.use(xxxx)使用插件。 1、安装 2、引入和使用 这个库&#xff0c;维护的频率不高了。还是建议使用&#xff1a;axios&#xff0c;vue-resource只是了解即可。

Qt Quick 教程(一)

文章目录 1.Qt Quick2.QML3.Day01 案例main.qml退出按钮&#xff0c;基于上面代码添加 4.使用Qt Design StudioQt Design Studio简介Qt Design Studio工具使用版本信息 1.Qt Quick Qt Quick 是一种现代的用户界面技术&#xff0c;将声明性用户界面设计和命令性编程逻辑分开。 …

win11照片裁剪视频无法保存问题解决

win11照片默认走核显&#xff0c;intel的显卡可能无法解码&#xff0c;在设置里把照片的显示卡默认换成显卡就好了

基于百度飞桨PaddleOCR应用开发实践银行卡卡面内容检测识别系统

OCR相关的内容我在之前的工作中虽有所涉及&#xff0c;但是还是比较少的&#xff0c;最近正好需要用到OCR的一些技术&#xff0c;查了一些资料&#xff0c;发现国内的话百度这块做的还是比较全面系统深入的&#xff0c;抱着闲来无事学习了解的心态&#xff0c;这里花了点时间基…

M1失效后,哪个是观察A股的关键新指标?

M1失效后&#xff0c;哪个是观察A股的关键新指标&#xff1f; 央地支出增速差&#xff08;地方-中央支出增速的差值&#xff09;或许是解释沪深300定价更有效的前瞻指标。该数值扩张&#xff0c;则有利于大盘指数&#xff0c;反之亦然&#xff0c;该指标从2017年至今对大盘指数…

【CSS in Depth2精译】1.1.4 源码顺序

解决层叠冲突的最后一环叫做 源码顺序&#xff0c;有时又称为 出现顺序&#xff08;order of appearance&#xff09;。如果其他判定规则均一致&#xff0c;则样式表中后出现的、或者在页面较晚引入的样式表声明&#xff0c;将最终胜出。 也就是说&#xff0c;可以通过控制源码…

解决WebStorm中不显示npm任务面板

鼠标右键项目的package.json文件&#xff0c;然后点击show npm scripts选项。 然后npm工具窗口就显示了&#xff1a;

基于`肿瘤浸润淋巴细胞`的AI风险评分预测`鼻咽癌`的`无局部生存率`|顶刊速递·24-06-20

小罗碎碎念 本期分享的文献是“AI-Based Risk Score from Tumour-Infiltrating Lymphocyte Predicts Locoregional-Free Survival in Nasopharyngeal Carcinoma”&#xff0c;翻译一下&#xff0c;即—— 基于肿瘤浸润淋巴细胞的人工智能风险评分预测鼻咽癌的无局部生存率。 文…

计算机网络——网络层重要协议(IP)

网络层的作用&#xff1a;在复杂的网络环境中确定一个合适的路径 IP 协议&#xff08;Internet Protocol&#xff09; IP 数据报格式 4 位版本号&#xff1a;指定 IP 协议的版本&#xff0c;对于 IPV4 来说就是 44 位首部长度&#xff1a;用于表示 IP 首部的长度&#xff0c…

Java零基础之多线程篇:线程生命周期

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

数据库 | SQL语言和关系代数汇总篇(*^▽^*)

双重/两个 not exists 嵌套查询 简单分析_两个not exists-CSDN博客 最明白的 not exists 双层嵌套讲解 SQL 查询语句_not exist 嵌套-CSDN博客 1. 答案&#xff1a; 2. 答案&#xff1a; 3. 4. 5. 6. 7. 8. 这个SQL查询是从两个表&#xff08;假设是SPJ和P&#xff09;中检…

Ubuntu服务器搭建Git远程仓库

本文所述方法适用于小型团队在局域网环境中使用Git进行代码版本管理。 1. 安装Git 打开终端(Ctrl + Alt + T) ,输入以下命令: sudo apt update #更新软件包列表信息 sudo apt install git #安装Git 验证Git是否安装成功,可以查看Git版本: git --version 也需…

Java基础入门day63

day63 JSON Jackson方式 package com.saas.test; ​ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.saas.entity.Student; import com.saas.entity.Birth; ​ import java.io.IOException; i…

大学生技能科普 | office 办公软件技能掌握 暑期电脑办公软件培训

为什么要学office&#xff1f; 提高工作效率&#xff1a;通过学习和掌握Office办公软件&#xff0c;可以更加高效地完成文档编辑、数据处理、图表制作等任务。 增强个人竞争力&#xff1a;在当今职场竞争中&#xff0c;熟练掌握Office办公软件已经成为一项基本的技能要求。掌…

FreeRTOS源码分析

目录 1、FreeRTOS目录结构 2、核心文件 3、移植时涉及的文件 4、头文件相关 4.1 头文件目录 4.2 头文件 5、内存管理 6、入口函数 7、数据类型和编程规范 7.1 数据类型 7.2 变量名 7.3 函数名 7.4 宏的名 1、FreeRTOS目录结构 使用 STM32CubeMX 创建的 FreeRTOS 工…

《STM32 HAL库》小米微电机控制例程——通信协议分析及驱动库

之前有段时间因为机器狗项目的缘故&#xff0c;一直在使用小米微电机&#xff0c;但是苦于没有一个详尽的奶妈级教程&#xff0c;在控制电机的学习中踩了不少的坑。今天咱们就从头至尾一步一步的实现使用按键控制小米微电机。本文将会分析小米电机驱动库&#xff0c;并简要介绍…

Web3新视野:Lumoz节点的潜力与收益解读

摘要&#xff1a;低估值、高回报、无条件退款80%...... Lumoz正通过其 zkVerifier 节点销售活动&#xff0c;引领一场ZK计算革命。 长期以来&#xff0c;加密市场以其独特的波动性和增长潜力&#xff0c;持续吸引着全球投资者的目光。而历史数据表明&#xff0c;市场往往在一年…

RAG 流程及论文串烧

文档切片 文档切片的五个层次 https://medium.com/anuragmishra_27746/five-levels-of-chunking-strategies-in-rag-notes-from-gregs-video-7b735895694d#b123 Basic RAG 与 Advanced RAG https://pub.towardsai.net/advanced-rag-techniques-an-illustrated-overview-04d…

pytorch库 02 Anaconda、Jupyter常用命令及操作

文章目录 一、Anaconda Prompt1、conda常用命令2、pip常用命令 二、Jupyter1、Jupyter常用命令及基本操作2、Jupyter代码补全插件安装 一、Anaconda Prompt 1、conda常用命令 下列命令可以在Anaconda Prompt中输入。 清屏&#xff1a; cls 查看帮助&#xff1a; conda -h 查…