【从零开始学习RabbitMQ | 第三篇】什么是延迟消息

目录

前言:

延迟消息:

延迟消息实现方式:

 死信交换机:

延迟消息插件:

1.基于注解的方式

2.基于@Bean的方式

总结:


 

前言:

        在现代软件开发中,异步消息处理已成为构建可扩展、高可用系统的关键组成部分。RabbitMQ,作为一款广泛使用的开源消息代理,提供了强大的消息队列功能,支持多种消息模式,包括发布/订阅、请求/响应以及路由等。然而,除了这些基本功能外,RabbitMQ还提供了一项独特的特性——延迟消息,它允许开发者安排消息在将来的某个时间点被处理。

延迟消息,顾名思义,是指那些在发送后不会立即被消费者接收的消息,而是根据预设的延迟时间后才能被消费。这种特性在许多场景下非常有用,例如定时任务的执行、订单超时处理、批处理作业的调度等。通过延迟消息,我们可以将即时处理的需求转化为按计划执行的任务,从而优化资源使用,提高系统的响应性和吞吐量。

延迟消息:

生产者发送消息的时候指定一个时间,消费者不会立即收到消息,而是在指定的时间之后才收到消息。

我举一个实际应用场景:买车票 

订单不代表付款,当我们下单之后,只有付款了我们才会更新库存状态 。在苍穹外卖中,我们采用的是定时任务轮询数据库机制,来取消超时订单。

但是这有一个弊端:对数据库的压力太大了,无论是每隔几秒都是对数据库的一次极致拷打。

在黑马点评中,我们用Redis模拟实现了延迟队列,其实就是用Stream去构造订单,过期之后就去数据库查询订单状态。

而在这种环境下,我们可以用RabbitMQ中的延迟队列,当下单之后,我们把消息发送给MQ,设置延迟时间为30分钟,等30分钟后,Rabbitmq检查订单状态,如果未支付就取消订单。

延迟消息实现方式:

 死信交换机:

当队列中的消息满足以下一种情况的时候,就会成为死信

  • 消费者使用basic.reject 或 basic.nack声明消费失败,并且消息的requeue参数设置为fasle
  • 消息是一个过期消息,超时无人消费
  • 要投递的消息队列满了,最早的消息成为死信

 当队列通过dead-letter-exchange 属性指定交换机之后,这个队列中的死信就会投递到这个交换机中,这个交换机成为死信交换机。

 这种机制的缺点就是代码实现比较麻烦。所以我们接下来介绍一下延迟消息插件

延迟消息插件:

延迟消息插件是Rabbitmq官方推出的一个插件,原生支持延迟消息,原理是设计了一个支持延迟消息功能的交换机,当消息投递到交换机的时候可以暂存一段时间,到期之后再投递到队列。

Releases · rabbitmq/rabbitmq-delayed-message-exchange (github.com)icon-default.png?t=N7T8https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases在上述网址中下载插件之后,存放到RabbitMQ的插件目录下就可以了。

安装延迟消息插件之后,想要实现延迟消息可以通过两桶途径:

1.基于注解的方式

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = "delay.queue", durable = "true"),
            exchange = @Exchange(value = "delay.direct", delayed = "true"),
            key = "delay"
    ))
    public void listenDelayQueue(String msg) {
        log.info("delay.queue:" + msg);
    }

2.基于@Bean的方式

@Configuration
public class DirectConfiguration {
 
    @Bean
    public DirectExchange delayExchange() {
        return ExchangeBuilder
                .directExchange("delay.direct")
                .delayed()
                .durable(true)
                .build();
    }
 
    @Bean
    public Queue delayedQueue() {
        return new Queue("delay.queue");
    }
 
    @Bean
    public Binding delayQueueBinding() {
        return BindingBuilder.bind(delayedQueue()).to(delayExchange()).with("delay");
    }
}

总结:

        在本文中,我们深入探讨了RabbitMQ中延迟消息的概念、实现方式以及应用场景。延迟消息是RabbitMQ提供的一项强大功能,它允许开发者安排消息在将来的某个特定时间点被处理,这种能力在许多实际应用中非常有用。

首先,我们介绍了延迟消息的基本概念,解释了它与传统即时消息处理的区别。我们了解到,延迟消息可以用于处理那些不需要立即执行的任务,而是可以安排在未来某个时间点执行。

接着,我们详细讨论了RabbitMQ实现延迟消息的几种方法,包括使用死信交换机(DLX)和消息的TTL属性,以及RabbitMQ 3.7版本之后引入的直接支持延迟消息的特性。这些方法各有优势,可以根据不同的业务需求和场景进行选择。

我们还探讨了如何配置和使用延迟消息,包括如何设置消息的延迟时间,以及如何创建和绑定死信交换机和死信队列。通过这些配置,我们可以确保消息在指定的延迟时间后被正确处理。

此外,我们讨论了延迟消息在实际应用中的价值,包括但不限于定时任务调度、订单超时处理、促销活动触发等场景。延迟消息的使用可以显著提高系统的灵活性和响应能力。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【前端学习笔记】HTML基础

HTML 一、HTML介绍1.HTML概念2.文档声明3.字符编码4. HTML标签5. HTML属性 二、标签1.meta标签2.语义标签3.布局标签4.列表5.超链接6.图片7.字符实体8.内联格式9.HTML 表格10.HTML 表单 三、HTML5新特性1. 本地存储2. Cookie3. 语义化标签4.多媒体元素5.表单增强6.Canvas7.SVG …

C++牛客周赛43题目分享(3)小红平分糖果,小红的完全平方数,小苯的字符串变化,小红的子数组排列判断

目录 ​编辑 1.前言 2.四道题目 2.1小红平分糖果 2.1.1题目描述 2.1.2输入描述 2.1.3输出描述 2.1.4示例 2.1.5代码 2.2小红的完全平方数 2.1.1题目描述 2.1.2输入描述 2.1.3输出描述 2.1.4示例 2.1.5代码 2.3小苯的字符串变化 2.1.1题目描述 2.1.2输入描述 …

基于51单片机简易温度计

一.硬件方案 本系统利用51单片机控制温度传感器DS18B20进行温度的实时检测并显示,能够实现快速测量环境温度。硬件以微控制器为核心,外接时钟电路、复位电路、温度测量电路、LED显示电路组成。 二.设计功能 (1)采用DS18B20温度…

如何将照片从 iPhone 传输到闪存驱动器【无质量损坏】

概括 人们喜欢用 iPhone 拍照,因为照片通常都很漂亮,这都要归功于 iPhone 令人惊叹的技术。但照片更新后会占用更多空间,并且您可能会开始收到没有存储空间的通知。因此,您可以将照片传输到 USB 驱动器,然后从 iPhone…

Broker的主从架构

为了保证MQ的数据不丢失而且具备一定的高可用性,所以一般都是得将Broker部署成Master-Slave模式的,也就是—个Master Broker对应一个Slave Broker Master需要在接收到消息之后,将数据同步给Slave,这样一旦Master Broker挂了&#…

嵌入式智能硬件茶杯垫的设计与实现方案

iCupBox简介 这是一款智能杯垫产品,基于GTD时间管理理念设计,目的是提醒人们专心工作和及时喝水休息,提高工作效率。 https://gitee.com/jiangtao008/iCupBox 开原许可协议:MIT 项目分为客户端APP和杯垫固件系统: 客户端APP,使用QML开发,集成GTD时间管理方法,与杯垫固…

芯片固定uv胶有什么优点?

芯片固定uv胶有什么优点? 芯片固定UV胶具有多种优点,这些优点使得它在半导体封装和芯片固定等应用中成为理想的选择。以下是芯片固定UV胶的一些主要优点: 固化速度快:UV胶在紫外线照射下能迅速固化,通常在几秒到几十秒…

【全开源】知识答题系统源码小程序(FastAdmin+ThinkPHP+Unipp)

打造智慧问答的基石 一、引言:知识答题系统的时代意义 在信息爆炸的时代,知识答题系统源码作为一种高效、有趣的知识传播方式,受到了越来越多人的关注和喜爱。通过搭建知识答题系统,我们可以将海量的知识内容以答题的形式展现给…

makefile一些特殊且常用的符号

$^&#xff1a;表示所有的依赖文件列表&#xff0c;多个文件以空格分隔。 $&#xff1a;表示目标文件的名称。 $<&#xff1a;表示第一个依赖文件的名称。 $*&#xff1a;表示目标文件的主文件名&#xff08;不包括扩展名&#xff09;。 $?&#xff1a;表示所有比目标文件更…

C# 泛型函数

1.非约束 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace MyGeneirc {public class GeneircMethod{/// <summary>/// 泛型方法解决&#xff0c;一个方法&#xff0c;满足不同参数类型…

鸿蒙ArkUI-X跨平台开发:【资源分类与访问】

资源分类与访问 应用开发过程中&#xff0c;经常需要用到颜色、字体、间距、图片等资源&#xff0c;在不同的设备或配置中&#xff0c;这些资源的值可能不同。 应用资源&#xff1a;借助资源文件能力&#xff0c;开发者在应用中自定义资源&#xff0c;自行管理这些资源在不同…

蓝桥楼赛第30期-Python-第三天赛题 提取电影信息题解

楼赛 第30期 Python 模块大比拼 提取电影信息 介绍 JSON&#xff08;JavaScript Object Notation, /ˈdʒeɪsən/&#xff09;是一种轻量级的数据交换格式&#xff0c;最初是作为 JavaScript 的子集被发明的&#xff0c;但目前已独立于编程语言之外&#xff0c;成为了通用的…

深入理解MySQL索引下推优化

在MySQL中&#xff0c;索引的使用对于查询性能至关重要。然而&#xff0c;即使有合适的索引&#xff0c;有时查询性能仍然不尽如人意。索引下推&#xff08;Index Condition Pushdown&#xff0c;ICP&#xff09;是一项能够进一步优化查询性能的技术。本文将详细讲解索引下推的…

人工智能与区块链技术:开启未来科技的双引擎

在当今科技飞速发展的时代&#xff0c;人工智能和区块链技术如同两颗璀璨的明星&#xff0c;照亮了人类通往未来的道路。 人工智能&#xff0c;以其强大的学习和分析能力&#xff0c;正悄然改变着我们的生活。它能够处理海量的数据&#xff0c;为我们提供精准的预测和个性化的…

STM32系列-STM32介绍

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” STM32介绍 STM32介绍 ST&#xff1a;指的是意法半导体 M&#xff1a;指定微处理器 32&#xff1a;表示计算机处理器位数 ARM分成三个系列&#xff1a; Cortex-A&#xff1…

Javascript--词法作用域

词法作用域 词法阶段 大部分标准化语言编辑器的第一个工作阶段叫做词法化&#xff0c;词法化会对源代码中的字符进行检查&#xff0c;如果是有状态的解析过程&#xff0c;还会赋予单词语义。 简单来说&#xff0c;词法作用域就是在词法阶段的作用域&#xff0c; function fo…

前端API: IntersectionObserver的那一二三件事

IntersectionObserver 基础 IntersectionObserver 可以监听一个元素和可视区域相交部分的比例&#xff0c;然后在可视比例达到某个阈值的时候触发回调。比如可以用来处理图片的懒加载等等 首先我们来看下基本的格式&#xff1a; const observer new IntersectionObserver(c…

SQLServer2012实例下某个数据库处于恢复挂起状态

由于机房电源线路故障&#xff0c;导致部分服务器飞正常状态下关机&#xff0c;电源线路重新恢复后&#xff0c;启动服务器后实例下有个数据库都显⽰“恢复挂起”状态&#xff0c;应用程序也⽆法对数据库的正常访问操作。 1、解决关键⽅法&#xff1a; run DBCC CHECKDB on t…

gin框架精通篇(二)

原生数据库使用 导入模块&#xff1a;go get -u github.com/go-sql-driver/mysql 安装 mysql 数据库 安装数据库可能遇到的问题&#xff1a;&#xff08;网上的方法基本可以解决&#xff09; ERROR 1045 (28000): Access denied for user ‘-root’‘localhost’ (using passwo…

ROS基础学习-话题通信机制研究

研究ROS通信机制 研究ROS通信机制 0.前言1.话题通信1.1 理论模型1.2 话题通讯的基本操作1.2.1 C++1.2.2 Python中使用自己的虚拟环境包1.2.2.1 参考11.2.2.2 参考21.2.2.3 /usr/bin/env:“python”:没有那个文件或目录1.2.3 Python1.2.2.1 发布方1.2.2.2 订阅方1.2.2.3 添加可执…