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

RabbitMQ延时队列

RabbitMQ延时队列

什么是延时队列

延时队列顾名思义,即放置在该队列里面的消息是不需要立即消费的,而是等待一段时间之后取出消费。

应用场景

场景一:在订单系统中,一个用户下单之后通常有30分钟的时间进行支付,如果30分钟之内没有支付成功,那么这个订单将进行一场处理。这是就可以使用延时队列将订单信息发送到延时队列。

场景二:用户希望通过手机远程遥控家里的智能设备在指定的时间进行工作。这时候就可以将用户指令发送到延时队列,当指令设定的时间到了再将指令推送到智能设备。

实现方式

Rabbitmq实现延时队列一般而言有两种形式: 第一种方式:利用两个特性: Time To Live(TTL消息过期)、Dead Letter Exchanges(DLX死信队列) 第二种方式:利用rabbitmq中的插件x-delay-message

三、第一种:利用TTL DLX实现延时队列的方式 AMQP协议和RabbitMQ队列本身没有直接支持延迟队列功能,但是可以通过以下特性模拟出延迟队列的功能。

1、Time To Live(TTL)

RabbitMQ可以针对Queue设置x-expires 或者 针对Message设置 x-message-ttl,来控制消息的生存时间,如果超时(两者同时设置以最先到期的时间为准),则消息变为dead letter(死信)

A: 通过队列属性设置,队列中所有消息都有相同的过期时间。 B: 对消息进行单独设置,每条消息TTL可以不同。

2、Dead Letter Exchanges(DLX)

RabbitMQ的Queue可以配置x-dead-letter-exchange和x-dead-letter-routing-key(可选)两个参数,如果队列内出现了dead letter,则按照这两个参数重新路由转发到指定的队列。 x-dead-letter-exchange:出现dead letter之后将dead letter重新发送到指定exchange x-dead-letter-routing-key:出现dead letter之后将dead letter重新按照指定的routing-key发送

用一个具体案例来实现第一种方式:用户下订单后,如何在一分钟没有支付就取消订单

死信队列

死信的概念

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

应用场景:为了保证订单业务的消息数据不丢失,需要使用到 RabbitMQ 的死信队列机制,当消息消费发生异常时,将消息投入死信队列中.还有比如说: 用户在商城下单成功并点击去支付后在指定时间未支付时自动失效

死信的来源

  • 消息 TTL 过期

  • 队列达到最大长度(队列满了,无法再添加数据到 mq 中)

  • 消息被拒绝(basic.reject 或 basic.nack)并且 requeue=false.

死信实战

package com.zking.xiongda.config;import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;import java.util.HashMap;
import java.util.Objects;@Configuration
public class QueueConfig {/*** 死信队列* @return*/@Beanpublic Queue deadQueue(){return new Queue("dead-queue");}/*** 死信交互机*/@Beanpublic Exchange deadExchange(){return new DirectExchange("dead-exchange");}/*** 绑定死信队列* @return*/@Beanpublic Binding bindingExchange(){return BindingBuilder.bind(deadQueue()).to(deadExchange()).with("dead-exchange.key").noargs();}/*** 普通队列* @return*/@Beanpublic Queue xioangdaQueue(){// hashmap设置对列参数信息HashMap<String, Object> hashMap = new HashMap<>();// 设置消息过期时间hashMap.put("x-message-ttl",20000);// 设置消息过期转换死信队列交换机hashMap.put("x-dead-letter-exchange","dead-exchange");// 设置改队列关联转移到交换机路由keyhashMap.put("x-dead-letter-routing-key","dead-exchange.key");// true是否持久,false:是否排他,false:是否自动删除return new Queue("xiongda-queue",true,false,false,hashMap);}/*** 普通交换机*/@Beanpublic Exchange xioangdaExchange(){return new DirectExchange("xiongda-exchange");}/*** 绑定普通队列* @return*/@Beanpublic Binding xioangdaDindingExchange(){return BindingBuilder.bind(xioangdaQueue()).to(xioangdaExchange()).with("xiongda-exchange.key").noargs();}}

相关文章:

RabbitMQ延时队列

RabbitMQ延时队列 什么是延时队列 延时队列顾名思义&#xff0c;即放置在该队列里面的消息是不需要立即消费的&#xff0c;而是等待一段时间之后取出消费。 应用场景 场景一&#xff1a;在订单系统中&#xff0c;一个用户下单之后通常有30分钟的时间进行支付&#xff0c;如…...

a8204 基于微信小程序的音乐播放器微信小程序的研究与实现 服务器端Java+Mysql+Servlet 文档 源码

音乐播放微信小程序 1.项目描述2. 绪论3.项目功能4.界面展示5.源码获取 1.项目描述 随着科技的发展&#xff0c;手机在我们生活中起到了重要的作用。软件作为手机重要的一部分&#xff0c;用户体验显得尤为重要。微信小程序一起操作便捷、用户基数大、分享便利、既用即走等特点…...

游戏新纪元:用栈记录数据,轻松实现悔棋功能

游戏介绍 嘿&#xff0c;各位游戏爱好者们&#xff01;今天我要给大家介绍一款颠覆传统、创新十足的游戏项目。这款游戏不仅让你沉浸在紧张刺激的游戏世界中&#xff0c;还引入了前所未有的两大特色功能&#xff1a;记录游戏数据和轻松实现悔棋。 首先&#xff0c;让我们来聊…...

C/C++基础知识复习(36)

函数重载是指在同一作用域内&#xff0c;定义多个同名但参数列表不同的函数。通过函数重载&#xff0c;程序员可以使用相同的函数名称处理不同类型或数量的参数&#xff0c;而不需要为每种情况创建不同的函数名称。编译器根据函数调用时传递的参数类型和数量来决定调用哪个版本…...

JAVA |日常开发中连接Sqlite数据库详解

JAVA &#xff5c;日常开发中连接Sqlite数据库详解 前言一、SQLite 数据库概述1.1 定义与特点1.2 适用场景 二、Java 连接 SQLite 数据库的准备工作2.1 添加 SQLite JDBC 驱动依赖2.2 了解 JDBC 基础概念 三、建立数据库连接3.1 代码示例3.2 步骤解析 四、执行 SQL 语句4.1 创建…...

Java项目实战II基于微信小程序的消防隐患在线举报系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着城市化进程的加快&…...

python编程Day12-属性和方法的分类

私有和公有 在python中 定义类的时候&#xff0c;可以给 属性和方法设置 访问权限&#xff0c;即规定在什么地方可以使用。 权限一般分为两种&#xff1a;公有权限、私有权限 公有权限 定义&#xff1a;直接定义的属性和方法就是公有的特点&#xff1a; 可以在任何地方访问和使…...

【unity小技巧】在 Unity 中,Application获取各种文件路径或访问不同类型的存储路径

文章目录 前言1. **Application.persistentDataPath**2. **Application.dataPath**3. **Application.streamingAssetsPath**4. **Application.temporaryCachePath**5. **Application.consoleLogPath**6. **Application.userDataPath**7. **Application.streamingAssetsPath 与 …...

c++:timer

1.设置休眠时间sleep_for 添加头文件 #include <thread> #include <iostream> #include <chrono> #include <thread>int main(int argc, char const *argv[]) {// 休眠2秒std::this_thread::sleep_for(std::chrono::seconds(2));// 休眠500毫秒std:…...

VSCode(四)CMake调试

1. 工具准备 1.1 C环境插件 1.2 CMake插件 2. Cmake工程 2.1 创建项目文件夹 ex:CMAKE_TEST 2.2 创建CMake工程 &#xff08;shift ctl P), 选择"CMAKE: Quick Start": 2.3 填写project name: (ex: test_cmake) 2.4 选择”Executable“ 项目文件内会自动…...

安装Docker并使用WSL

引言 Windows Subsystem for Linux (WSL) 是一个在Windows上运行Linux二进制可执行文件&#xff08;ELF格式&#xff09;的兼容层。它允许开发者直接在Windows上运行Linux环境&#xff0c;而无需使用虚拟机。Docker是一个开源的应用容器引擎&#xff0c;它允许开发者打包应用以…...

HCIA-openGauss_2_2连接与认证

设置客户端认证策略 设置配置文件参数 gssql客户端连接-确定连接信息 客户端工具通过数据库主节点连接数据库&#xff0c;因此连接前&#xff0c;需要获取数据库主节点的在服务器的IP地址及数据库主节点的端口号信息。 步骤1&#xff1a;以操作系统用户omm登录数据库主节点。…...

安装 pytorch lighting

1 搜寻配对版本 进入lighting官网&#xff0c;查看配对版本 比如我就选择Python3.11、torch2.4、lightning2.4.0 2 搜寻pytorch安装命令 进入pytorch官网&#xff0c;查看以前版本的下载命令 注意要选择是 gpu版本的pytorch查看自己显卡驱动命令&#xff1a;nvidia-smi查看…...

2024年12月7日历史上的今天大事件早读

1732年12月07日英国皇家大剧院在伦敦开幕 1798年12月07日清代诗人袁枚逝世 1889年12月07日第一个充气轮胎受专利保护 1916年12月07日劳合-乔治出任英国首相 1926年12月07日第一台电冰箱受美国专利保护 1937年12月07日南京保卫战正式打响 1941年12月07日日本偷袭珍珠港 1…...

ORB-SLAM2 ---- 非线性优化在SLAM中的应用(一)

文章目录 一、为什么要讲非线性优化二、运动模型和观测模型三、最大似然估计四、SLAM中最小二乘的应用五、总结 一、为什么要讲非线性优化 相信大家在学习一段时间SLAM后&#xff0c;会发现两个问题。第一个是代码能看懂&#xff0c;但是不知道为什么这样做&#xff08;特别是优…...

FastAPI中创建一个多App架构

1. 创建项目结构 首先&#xff0c;设计一个合理的项目结构。这里以三个Apps为例&#xff1a;users、items 和 orders。2. 项目结构 my_fastapi_project/ ├── main.py ├── app/ │ ├── __init__.py │ ├── users/ │ │ ├── __init__.py │ │ ├─…...

计算机网络原理之HTTP与HTTPS

一、前言 为了理解HTTP&#xff0c;我们有必要事先了解一下TCP/IP协议簇。 通常我们使用的网络&#xff08;包括互联网&#xff09;是在TCP/IP协议簇的基础上运作的。而HTTP属于它内部的一个子集。 计算机与网络设备要相互通信&#xff0c;双方必须基于相同的方法。比如&#…...

完全按照手册win10里装Ubuntu 虚拟机然后编译ESP32(主要是想针对ESP32C3和S3)开发板的鸿蒙系统(失败)

基本上完全按照手册来的&#xff0c;除了Ubuntu虚拟机使用了22.04 Jammy版本&#xff0c;鸿蒙手册里是20.04 版本&#xff0c;主要是鸿蒙里3年前的手册了&#xff0c;所以就擅自用了高版本。 据此还想到一点&#xff0c;鸿蒙LiteOS&#xff0c;还挺稳定的&#xff0c;3年也没有…...

vsphere vcenter web 界面的介绍

这是主页的页面...

【pyspark学习从入门到精通23】机器学习库_6

目录 分割连续变量 标准化连续变量 分类 分割连续变量 我们经常处理高度非线性的连续特征&#xff0c;而且只用一个系数很难拟合到我们的模型中。 在这种情况下&#xff0c;可能很难只通过一个系数来解释这样一个特征与目标之间的关系。有时&#xff0c;将值划分到离散的桶中…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...

sshd代码修改banner

sshd服务连接之后会收到字符串&#xff1a; SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢&#xff1f; 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头&#xff0c…...