【Node.js】RabbitMQ 延时消息

news2024/9/24 19:24:16

概述

在 RabbitMQ 中实现延迟消息通常需要借助插件(如 RabbitMQ 延迟队列插件),因为 RabbitMQ 本身不原生支持延迟消息。

延迟消息的一个典型场景是,当消息发布到队列后,等待一段时间再由消费者消费。这可以通过配置 TTL(Time-To-Live)和死信队列(DLX, Dead Letter Exchange)实现,或者通过 RabbitMQ 的延迟插件实现。

安装插件

下载地址

在这里插入图片描述

直接点击下载,然后将下载后的文件直接放入在 plugins 目录中:

在这里插入图片描述

启动插件:

rabbitmq-plugins enable rabbitmq_delayed_message_exchange

检查是否成功

打开可视化面板,访问 http://localhost:15672/#/ 账号密码都是 guest

发现新增了一个延迟队列类型 x-delayed-message:

在这里插入图片描述

延迟消息实现步骤

1. 创建一个延迟交换机

RabbitMQ 延迟插件允许我们使用一种特殊的交换机类型 x-delayed-message,可以设置延迟时间。

2. 发送延迟消息

通过设置消息属性中的 x-delay 来定义延迟时间。

3. 消费消息

消费者在消息到达指定的延迟时间后可以消费。

代码示例

1. 发送延迟消息的生产者代码
const amqp = require('amqplib');

async function sendDelayedMessage() {
  const exchangeName = 'delayed_exchange';
  const routingKey = 'my_routing_key';
  const delayTime = 5000; // 延迟 5 秒

  // 连接到 RabbitMQ 服务器
  const connection = await amqp.connect('amqp://localhost');
  const channel = await connection.createChannel();

  // 声明延迟交换机
  await channel.assertExchange(exchangeName, 'x-delayed-message', {
    durable: true,
    arguments: {
      'x-delayed-type': 'direct', // 交换机的基础类型
    },
  });

  const message = 'Hello, this is a delayed message!';

  // 发送带有延迟的消息
  channel.publish(exchangeName, routingKey, Buffer.from(message), {
    headers: {
      'x-delay': delayTime, // 设置延迟时间
    },
  });

  console.log(`[x] Sent delayed message: "${message}" with delay: ${delayTime}ms`);

  // 关闭连接
  setTimeout(() => {
    connection.close();
  }, 1000);
}

sendDelayedMessage().catch(console.error);
2. 消费延迟消息的消费者代码
const amqp = require('amqplib');

async function consumeDelayedMessage() {
  const exchangeName = 'delayed_exchange';
  const queueName = 'delayed_queue';
  const routingKey = 'my_routing_key';

  // 连接到 RabbitMQ 服务器
  const connection = await amqp.connect('amqp://localhost');
  const channel = await connection.createChannel();

  // 声明队列并绑定到交换机
  await channel.assertQueue(queueName, { durable: true });
  await channel.bindQueue(queueName, exchangeName, routingKey);

  console.log('[*] Waiting for messages in delayed queue. To exit press CTRL+C');

  // 消费消息
  channel.consume(queueName, (msg) => {
    if (msg !== null) {
      console.log(`[x] Received delayed message: "${msg.content.toString()}"`);
      channel.ack(msg); // 手动确认消息
    }
  });
}

consumeDelayedMessage().catch(console.error);
  1. 生产者部分

    • 使用 x-delayed-message 交换机,它允许消息在交换机中保留一段时间(通过 x-delay 属性),再发布到相应的队列。
    • 通过设置消息属性 headers: { 'x-delay': delayTime } 来指定延迟的时间。
  2. 消费者部分

    • 声明一个队列并将其绑定到延迟交换机,消费者从队列中接收消息。
    • 当消息的延迟时间到达后,消息被投递到队列并由消费者处理。

总结

使用延迟插件可以简化 RabbitMQ 中延迟消息的实现。

通过 x-delayed-message 交换机和 x-delay 属性,开发者可以灵活地控制消息的延迟发送时间。这种方式常用于需要延迟执行某些任务的场景,例如订单超时处理、延迟通知、预约外卖时延迟预约消息推送到商家等。

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

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

相关文章

【拦截导弹】

​ 题目 ​​ 题解 题解:1010. 拦截导弹(dp与贪心) - AcWing 我谈几点: 第一,由此复习了upper_bound和lower_bound函数 第二,由此学习了贪心方式求“最多分割不严格递减子序列的数目”和“最长不严格递…

算法参数对拥塞控制的影响

来看看参数对公平收敛的影响。仅假象一下就知道应该是个加权公平,但事实如何,还是要具体看一下。 首先看 aimd,标准的 reno 算法是每 round 之后 cwnd 加 1,但如果有些流加 1,有些流加 2,会如何&#xff1…

踩坑【已解决】:使用maven打印结果是控制台输出中文乱码

报错原图: 解决方案: 1、修改maven->runner中的配置添加如下信息: -Dfile.encodingUTF-8 2、检查编码的配置信息: 3、检查窗口右下角的配置信息: 解决结果:

SEGGERS实时系统embOS推出Linux端模拟器

SEGGER 发布了两个新的 embOS 仿真模拟器:embOS Sim Linux 和 embOS-MPU Sim Linux。 通过模拟 Linux 主机系统上的硬件,取代物理硬件,为开发人员提供了一种无缝的方式来构建原型和测试应用程序。 embOS Sim Linux 端口支持 32 位和 64 位系…

【在Linux世界中追寻伟大的One Piece】网络命令|验证UDP

目录 1 -> Ping命令 2 -> Netstat命令 3 -> Pidof命令 4 -> 验证UDP-Windows作为client访问Linux 4.1 -> UDP client样例 1 -> Ping命令 Ping命令是一种网络诊断工具,它使用ICMP(Internet Control Message Protocol,互联网控制消…

CAN BUS

CAN BUS 原理 网上资料非常丰富,是车载系统主要BUS之一。 我们关注如下方面 can bus 是什么网络结构CAN BUS 协议ECU node实现其他 What is CAN Bus? Control Area Network (CAN) bus is a serial communication protocol that allows devices to exchange dat…

MySQL:视图【详解】

1、视图 1.1 视图的定义 视图是在数据库中定义的虚拟表。它是一个基于一个或多个实际表的查询结果集,可以像实际表一样被查询和操作。视图可以看作是一个动态生成的数据表,其内容是从其他表中选择、过滤和计算得到的。 视图通过使用SQL查询语句来定义…

Framebuffer应用编程

目录 前言 LCD操作原理 涉及的 API 函数 open函数 ioctl 函数 mmap 函数 Framebuffer程序分析 源码 1.打开设备 2.获取LCD参数 3.映射Framebuffer 4.描点函数 5.随便画几个点 上机实验 前言 本文介绍LCD的操作原理和涉及到的API函数,分析Framebuffer…

配置全新服务器深度学习一套流程

目录 1.安装anaconda2.配置cuda3.配置cudnn4.配置新的pytorch环境5.安装rdkit包6.小问题记录 1.安装anaconda 直接参考视频 总结: 1.下载anaconda安装包,尽量不下载最新的版本 2.bash 对应安装包,一直回车,yes 3.配置环境vim ~/.…

点餐小程序实战教程10权限验证

目录 1 创建员工的全局变量2 创建员工首页3 跳转到员工首页4 给全局变量赋值5 验证权限6 登录的完整代码总结 我们已经实现了员工的注册及登录功能,登录成功后需要跳转到我们的员工首页。在首页加载的时候我们需要去验证当前用户是否已经登录,未登录我就…

深入理解数据分析的使用流程:从数据准备到洞察挖掘

数据分析是企业和技术团队实现价值的核心。 5 秒内你能否让数据帮你做出决策? 通过本文,我们将深入探讨如何将原始数据转化为有意义的洞察,帮助你快速掌握数据分析的关键流程。 目录 数据分析的五个核心步骤1. 数据获取常用数据获取方式 2. 数…

synchronized的详解、锁的升级过程和优缺点比较

本文 详细介绍Java中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级 锁、重量级锁,以及锁升级过程。 Java中每一个对象都可以作为锁。具体表现形式为以下三种形式: 对于普通的同步方法,锁是当前的实例对象对于静态同步方法&a…

攻防世界--->秘密-银河-300

做题笔记。 适用于reverse的隐写术。。。。啊哈哈哈哈 下载 查壳。(用的WSL->Debian) 64ida打开。 运行程序如下: 反汇编看不出来什么名堂,那就去看汇编代码。 下个断点。 东看看西看看 这是我们程序打印代码 往下翻: SECRET 秘密。 我…

路径规划 | 基于A*算法的往返式全覆盖路径规划的改进算法(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 基于A*算法的往返式全覆盖路径规划的改进算法 matlab实现代码 往返式全覆盖路径规划,通过建立二维栅格地图,设置障碍物,以及起始点根据定义往返式路径规划的定义的优先级运动规则从…

网页本地存储

网页本地存储 <html> <script>//添加数据function add(){var text;textdocument.getElementById(text).value;indexlocalStorage.length1;localStorage.setItem(index,text);}//显示localStorage所有内容function showall(){storagelocalStorage;var length stor…

209.长度最小的子数组(滑动窗口类)

文章目录 209.长度最小的子数组滑动窗口904. 水果成篮76. 最小覆盖子串 209.长度最小的子数组 209.长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 s &#xff0c;找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组&#xff0c;并返回其长度。如果不存在符合…

2020ICPC上海 D - Walker M - Gitignore

D: 首先显然要二分,判断当前二分的mid时间下是否能满足走满0~n 枚举所有情况,这里按照左,右起点p1,p2分别讨论 p1向左 p2向左(以下向左和向右都代表向左或者向右到墙,而不代表初速度方向)&#xff0c;只需要计算p1或者p2反弹之后还能走距离n就是合法 p1向左 p2向右&#xff…

C++在Linux实现多线程和多进程的TCP服务器和客户端通信

多进程版本 服务器 #include <arpa/inet.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <sys/wait.h> #include <signal.h> #include <string&…

软件设计师——程序设计语言

目录 低级语言和高级语言 编译程序和解释程序 正规式&#xff0c;词法分析的一个工具 有限自动机 ​编辑 上下文无关法 ​编辑 中后缀表示法 杂题 ​编辑 低级语言和高级语言 编译程序和解释程序 计算机只能理解由0、1序列构成的机器语言&#xff0c;因此高级程序设计…

CAD_Electrical 2022使用记录

一、CAD软件实用调整 1、如何调节窗口背景颜色 例如&#xff1a;将图中白色的背景色调节为黑色。 步骤&#xff1a;在CAD空白区域点击右键 -> 点击选项 -> 在显示中点击颜色(窗口元素) -> 将二维模型空间统一背景的颜色修改成需要的颜色 2、如何调节关标大小 例如&a…