如何使用PHP和RabbitMQ实现延迟队列(方式二)?

前言

前几天写了一篇关于PHP和RabbitMQ如何通过插件实现延迟队列的功能。

今天写另外一篇不需要插件的方式,使用RabbitMQ的死信队列(Dead-Letter-Exchanges, DLX)和消息TTL(Time-To-Live)。

这种方法涉及到设置消息的TTL,当消息在队列中超过设定的TTL时间后,它会被发送到死信交换器。然后,你可以配置死信交换器将消息路由到另一个队列进行处理。这种方式不需要安装任何插件,但延迟时间的精度取决于消息在队列中的等待时间。

前期准备,需要安装好docker、docker-compose的运行环境。

需要安装RabbitMQ,以及通过插件实现延迟队列功能的可以浏览以下文章。

如何使用PHP和RabbitMQ实现消息队列?-CSDN博客

如何使用PHP和RabbitMQ实现延迟队列(方式一)?-CSDN博客

一、禁用RabbitMQ延迟插件功能

1、进入RabbitMQ容器,执行如下命令。

docker exec -ti rabbitmq bash

2、禁用插件,执行如下命令。

rabbitmq-plugins disable rabbitmq_delayed_message_exchange

3、检查已启用插件,执行如下命令。

rabbitmq-plugins list -e

通过下图可以看出,rabbitmq_delayed_message_exchange插件已不在启用名单中。

4、重启RabbitMQ服务。

5、至此,RabbitMQ延迟插件已禁用。

二、测试验证

1、编写生产者,代码内容如下。

vim dle_producer.php
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

$connection = new AMQPStreamConnection('rabbitmq', 5672, 'guest', 'guest');
$channel = $connection->channel();

// 声明延迟交换器
$delayExchange = 'delayed_exchange';
$channel->exchange_declare($delayExchange, 'direct', false, true, false);

// 声明延迟队列,并设置死信交换器和消息TTL
$delayQueue = 'delayed_queue';
$dlxExchange = 'dlx_exchange';
$delay = 5000;
$args = new \PhpAmqpLib\Wire\AMQPTable([
    'x-dead-letter-exchange' => $dlxExchange,
    'x-message-ttl' => $delay, // 消息在队列中的最大生存时间,单位毫秒
]);
$channel->queue_declare($delayQueue, false, true, false, false, false, $args);
$channel->queue_bind($delayQueue, $delayExchange, '');

// 发送消息到延迟队列
$messageBody = 'Hello Max!';
$message = new AMQPMessage($messageBody, ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);
$channel->basic_publish($message, $delayExchange, '');

echo "Sent {$messageBody} with delay {$delay}ms\n";
$datetime = date('Y/m/d H:i:s');
echo "成功发送延迟消息 : {$messageBody} , {$datetime} \n";

$channel->close();
$connection->close();

2、编写消费者,代码内容如下。

vim dle_consumer.php
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;

$connection = new AMQPStreamConnection('rabbitmq', 5672, 'guest', 'guest');
$channel = $connection->channel();

// 声明死信交换器
$dlxExchange = 'dlx_exchange';
$channel->exchange_declare($dlxExchange, 'direct', false, true, false);

// 声明死信队列
$dlxQueue = 'dlx_queue';
$channel->queue_declare($dlxQueue, false, true, false, false);
$channel->queue_bind($dlxQueue, $dlxExchange, '');

echo "Waiting for messages. To exit press CTRL+C\n";

// 消费者监听死信队列
$callback = function (PhpAmqpLib\Message\AMQPMessage $msg) {
    $datetime = date('Y/m/d H:i:s');
    echo "Received " . $msg->body . ",datetime=${datetime}\n";
};

$channel->basic_consume($dlxQueue, '', false, true, false, false, $callback);

while ($channel->is_consuming()) {
    $channel->wait();
}

$channel->close();
$connection->close();

3、启动消费端,执行如下命令。

php dle_consumer.php

正常情况会返回如下内容,监听消息。

4、运行生产端代,执行如下命令。

php dle_producer.php

5、再看消费端接收到的消息,正常返回如下内容。

从上面截图可以看出时间刚好是5秒钟。发送时间是07:35:34,消费时间是07:35:59。

6、至此,延迟队列的测试验证已完成。

总结

用PHP和RabbitMQ实现消息队列的延迟功能的两种方式。

1、使用RabbitMQ的rabbitmq_delayed_message_exchange插件。

如何使用PHP和RabbitMQ实现延迟队列(方式一)?-CSDN博客

2、使用RabbitMQ的死信队列(Dead-Letter-Exchanges, DLX)和消息TTL(Time-To-Live)

上面的代码只是做个简单的示例,如果运用到实际的项目当中需要做进一步的优化。

最后因本人能力有限,有什么不对的地方望各位大佬指出好让我改进,多多包含,谢谢大家。

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

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

相关文章

3款免费甘特图制作工具的比较和选择指南

GanntProject GanttProject https://www.ganttproject.biz/ 是一款项目管理和调度应用&#xff0c;适用于 Windows、macOS 和 Linux。它易于使用&#xff0c;无需任何设置&#xff0c;适用于个人用户和小型团队。该应用提供任务层次结构和依存关系、里程碑、基准行、Gantt 图表…

Knative 助力 XTransfer 加速应用云原生 Serverless 化

作者&#xff1a;元毅 公司介绍 XTransfer 是一站式外贸企业跨境金融和风控服务公司&#xff0c;致力于帮助中小微企业大幅降低全球展业的门槛和成本&#xff0c;提升全球竞争力。公司连续7年专注 B2B 外贸金融服务&#xff0c;已成为中国 B2B 外贸金融第一平台&#xff0c;目…

20240325,结构嵌套,联合,全局变量,编译预处理和宏,声明

二&#xff0c;结构 2.3 结构中的结构 2.3.1 结构数组 #include<stdio.h>//下一秒 struct time{int hour;int min;int sed; }; struct time timeupdate(struct time now); int main(){struct time testTime[5]{{11,59,59},{12,0,0},{1,29,59},{23,59,59},{19,12,27}…

数据结构 之 队列习题 力扣oj(附加思路版)

优先级队列 #include<queue> --队列 和 优先级队列的头文件 优先级队列&#xff1a; 堆结构 最大堆 和 最小堆 相关函数&#xff1a; front() 获取第一个元素 back() 获取最后一个元素 push() 放入元素 pop() 弹出第一个元素 size() 计算队列中元素…

Maven学习记录

一、简介 1. Maven&#xff1a; 基于 Java 平台的项目管理和整合工具&#xff0c;将项目的开发和管理过程抽象成一个项目对象模型&#xff08;POM&#xff09;。开发人员只需要做一些简单的配置&#xff0c;Maven 就可以自动完成项目的编译、测试、打包、发布以及部署等工作。…

把学浪视频保存到电脑方法

为了可以更好的学习很多用户都会想要将学浪的视频下载下来,但是学浪视频官方却没有提供下载方法,为了将学浪视频下载下来我研究了一段时间,总算有突破,找到了下载方法 文章中所用到的工具就在下面,有需要的自己取一下 链接&#xff1a;https://pan.baidu.com/s/1y7vcqILToULr…

go的for循环应该这么用

目录 目录 一&#xff1a;介绍 1: for流程控制 2&#xff1a;for-range流程控制 二&#xff1a;实例展示 1&#xff1a;//按照一定次数循环 2&#xff1a;//无限循环 3: //循环遍历整数、各种容器和通道 4&#xff1a;遍历通道 5&#xff1a;//指针数组循环 6&…

git笔记之撤销、回退、reset方面的笔记

git笔记之撤销、回退、reset方面的笔记 code review! 文章目录 git笔记之撤销、回退、reset方面的笔记1.git 已经commit了&#xff0c;还没push&#xff0c;如何撤销到初始状态git reset --soft HEAD~1git reset HEAD~1&#xff08;等同于 git reset --mixed HEAD~1&#xff0…

机器学习OpenNLP

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl OpenNLP概述 OpenNLP是一个基于机器学习的自然语言处理开发工具包&#xff0c;它是Apache软件基金会的一个开源项目。OpenNLP支持多种自然语言处理任务&#xff0c;如分词、…

计算机网络:现代通信的基石

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

如何忽略Chrome最小字号的限制

通过控制台调整字体大小时&#xff0c;可以发现即便设置了小于12px的字号&#xff0c;也并不会变小&#xff0c;这是因为Chrome默认最小字号为12px。 在Chrome设置中的外观选项卡中可以发现&#xff0c;默认字体是16px。将最小字号改为0&#xff0c;就能随意设置小于12px的字号…

面向对象【枚举类】

文章目录 枚举类定义枚举类enum 方式定义的要求和特点 enum 中常用方法实现接口的枚举类 枚举类 枚举类是一种特殊的类&#xff0c;它用于定义一组固定数量的常量。枚举类在实际开发中非常有用&#xff0c;因为它们可以增加代码的可读性和可维护性。本文将介绍Java枚举类的定义…

[网鼎杯2018]Unfinish 两种方法 -----不会编程的崽

网鼎杯太喜欢搞二次注入了吧。上次是无列名盲注&#xff0c;这次又是二次注入盲注。。。不知道方法还是挺难的。哎&#xff0c;网鼎嘛&#xff0c;能理解透彻就很强了。能自己做出来那可太nb了。 又是熟悉的登录框。不知道这是第几次看见网鼎杯的登录框了。后台扫描一下&#x…

基于深度学习的海洋鱼类识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 ............................................................ % 对测试集进行分类预测 [Pr…

西安石油大学校赛培训(1)数学模型简介 初等模型

数学建模竞赛 什么是数学建模竞赛?数学竞赛给人的印象是高深莫测的数学难题,和一个人、一支笔、一张纸&#xff0c;关在屋子里的冥思苦想&#xff0c;它训练严密的逻辑推理和准确的计算能力&#xff0c;而数学建模竞赛从内容到形式与此都有明显的不同。 数学建模竞赛的题目由日…

高防服务器、高防IP、高防CDN的工作原理是什么

高防IP高防CDN我们先科普一下是什么是高防。“高防”&#xff0c;顾名思义&#xff0c;就犹如网络上加了类似像盾牌一样很高的防御&#xff0c;主要是指IDC领域的IDC机房或者线路有防御DDOS能力。 高防服务器主要是比普通服务器多了防御服务&#xff0c;一般都是在机房出口架设…

学点儿Java_Day10_集合框架(List、Set、HashMap)

1 简介 ArrayList: 有序(放进去顺序和拿出来顺序一致)&#xff0c;可重复 HashSet: 无序(放进去顺序和拿出来顺序不一定一致)&#xff0c;不可重复 Testpublic void test1() {String[] array new String[3];//List: 有序 可重复//有序: 放入顺序 与 拿出顺序一致&#xff0c;…

Github多账号共存

在开发阶段&#xff0c;如果同时拥有多个开源代码托管平台的账户&#xff0c;在代码的管理上非常麻烦。那么&#xff0c;如果同一台机器上需要配置多个账户&#xff0c;怎样才能确保不冲突&#xff0c;不同账户独立下载独立提交呢&#xff1f; 我们以两个github账号进行演示 …

基于STM32的最小系统电路设计(手把手零基础教学)

文章目录 前言一、复位电路二、晶振电路三、电源转换电路四、SWD下载电路五、LED测试电路六、芯片外扩引脚七、STM32微控制电路总结 前言 在上篇介绍完《STM32的核心板制作流程》后&#xff0c;本篇我们将开始学习STM32最小系统电路的设计。具体包括复位电路、晶振电路、电源转…

快速入门go语言

环境搭建 编译器安装 1、编译器下载地址 2、打开命令行模式&#xff0c;输入go version ide安装 ide下载地址 依赖管理 goproxy 1、goproxy代理地址 // 阿里云 https://mirrors.aliyun.com/goproxy // 微软 https://goproxy.io // 七牛 https://goproxy.cn 2、ide配置g…