设为首页收藏本站
天天打卡

 找回密码
 立即注册
搜索
查看: 50|回复: 13

使用PHP和RabbitMQ实现消息队列的延迟功能

[复制链接]

6

主题

52

回帖

236

积分

中级会员

积分
236
发表于 2024-4-19 20:16:21 | 显示全部楼层 |阅读模式
目录


前言

今天我们来做个小试验,用PHP和RabbitMQ实现消息队列的延迟功能。
前期准备,需要安装好docker、docker-compose的运行环境。
需要安装RabbitMQ的可以看下面这篇文章。
使用PHP和RabbitMQ实现消息队列功能_php技巧_脚本之家 (jb51.net)

一、安装RabbitMQ延迟插件

1、打开rabbitmq插件官网。
地址如下:Community Plugins | RabbitMQ
找到对应的延迟插件,rabbitmq_delayed_message_exchange,如下图所示。

2、进入RabbitMQ容器,下载对应插件,执行如下命令。
  1. docker exec -ti rabbitmq bash
  2. cd /opt/rabbitmq/plugins/
  3. wget https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases/download/3.9.0/rabbitmq_delayed_message_exchange-3.9.0.ez
复制代码
如下图所示,找到自己RabbitMQ对应的版本,下载.ez文件。

3、启用插件,执行如下命令。
  1. rabbitmq-plugins enable rabbitmq_delayed_message_exchange
复制代码
4、重启RabbitMQ服务。
5、检查RabbitMQ已启用哪些插件,执行如下命令。
  1. rabbitmq-plugins list -e
复制代码
正常会返回如下内容。

上图说明延迟插件已启用。
6、至此,RabbitMQ的延迟插件已安装完成。

二、安装php-amqplib

1、安装php composer,执行如下命令。
  1. curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
复制代码
2、编写composer.json,内容如下,这里下载php-amqplib的版本是3.6。
  1. vim composer.json
  2. {
  3.     "require": {
  4.         "php-amqplib/php-amqplib": "3.6.*"
  5.     }
  6. }
复制代码
3、下载包,执行如下命令。
  1. composer install
复制代码
正常情况下,安装完成的话,当前目录会多一个vendor目录,如下图所示。

4、至此php-amqplib已安装完成。

三、测试验证

1、编写生产者,代码内容如下。
  1. vim producer.php
  2. <?php
  3. require_once __DIR__ . '/vendor/autoload.php';
  4. use PhpAmqpLib\Connection\AMQPStreamConnection;
  5. use PhpAmqpLib\Message\AMQPMessage;

  6. // 连接到RabbitMQ服务器
  7. $connection = new AMQPStreamConnection('rabbitmq', 5672, 'guest', 'guest');
  8. $channel = $connection->channel();

  9. // 声明一个具有延迟插件的自定义交换机
  10. $args = new \PhpAmqpLib\Wire\AMQPTable([
  11.     'x-delayed-type' => \PhpAmqpLib\Exchange\AMQPExchangeType::FANOUT // 这里假设我们使用 direct 类型的交换机
  12. ]);
  13. $channel->exchange_declare('delayed_exchange', 'x-delayed-message', false, true, false, false, false, $args);

  14. $messageBody = 'Hello Max!';
  15. $delay = 5000; // 延迟5秒,单位是毫秒
  16. $headers = new \PhpAmqpLib\Wire\AMQPTable(['x-delay' => $delay]);
  17. $message = new AMQPMessage($messageBody, ['delivery_mode' => 2]);
  18. $message->set('application_headers', $headers);

  19. // 发布消息到交换机
  20. $channel->basic_publish($message, 'delayed_exchange', 'delayed_key');

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

  24. // 关闭连接
  25. $channel->close();
  26. $connection->close();
复制代码
2、编写消费者,代码内容如下。
  1. vim consumer.php
  2. <?php
  3. require_once __DIR__ . '/vendor/autoload.php';
  4. use PhpAmqpLib\Connection\AMQPStreamConnection;
  5. use PhpAmqpLib\Message\AMQPMessage;

  6. // 连接到RabbitMQ服务器
  7. $connection = new AMQPStreamConnection('rabbitmq', 5672, 'guest', 'guest');
  8. $channel = $connection->channel();

  9. // 声明一个具有延迟插件的自定义交换机
  10. $args = new \PhpAmqpLib\Wire\AMQPTable([
  11.     'x-delayed-type' => \PhpAmqpLib\Exchange\AMQPExchangeType::FANOUT // 这里假设我们使用 direct 类型的交换机
  12. ]);
  13. $channel->exchange_declare('delayed_exchange', 'x-delayed-message', false, true, false, false, false, $args);

  14. // 声明死信队列
  15. $channel->queue_declare(
  16.     'delayed_queue',
  17.     false,
  18.     true,
  19.     false,
  20.     false,
  21.     false,
  22.     new \PhpAmqpLib\Wire\AMQPTable([
  23.         'x-dead-letter-exchange' => 'delayed'
  24.     ])
  25. );

  26. // 绑定队列到交换机
  27. $channel->queue_bind('delayed_queue', 'delayed_exchange', 'delayed_key');

  28. echo "正在等待延迟队列消息, waiting... \n";

  29. $callback = function (AMQPMessage $message) {
  30.     //$headers = $message->get('application_headers');
  31.     //$nativeData = $headers->getNativeData();
  32.     echo $message->body . '-------' . date('Y/m/d H:i:s') . "\n";
  33.     $message->ack();
  34. };

  35. $channel->basic_consume(
  36.     'delayed_queue',
  37.     '',
  38.     false,
  39.     false,
  40.     false,
  41.     false,
  42.     $callback
  43. );

  44. while ($channel->is_consuming()) {
  45.     $channel->wait();
  46. }

  47. // 关闭连接
  48. $channel->close();
  49. $connection->close();
复制代码
3、启动消费端,执行如下命令。
  1. php consumer.php
复制代码
正常情况会返回如下内容,等等消息。

4、运行生产端代,执行如下命令。
  1. php producer.php
复制代码
正常情况会返回如下内容。

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

从上面截图可以看出时间刚好是5秒钟。发送时间是08:44:49,消费时间是08:44:54。
6、至此,延迟队列的测试验证已完成。

总结

用PHP和RabbitMQ实现消息队列的延迟功能,其实依靠的是RabbitMQ的一个延迟插件,主要有以下几个步骤。
1、安装RabbitMQ延迟插件。
2、安装PHP的AMQP扩展、php-amqplib代码包。
3、编写生产者、消费者进行验证。
上面的代码只是做个简单的示例,如果运用到实际的项目当中需要做进一步的优化。
到此这篇关于使用PHP和RabbitMQ实现消息队列的延迟功能的文章就介绍到这了,更多相关PHP RabbitMQ延迟队列内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

0

主题

69

回帖

139

积分

注册会员

积分
139
发表于 2024-4-28 10:42:55 | 显示全部楼层
我不太确定,可能需要再确认一下。

2

主题

39

回帖

123

积分

注册会员

积分
123
发表于 2024-6-7 08:07:18 | 显示全部楼层
牛逼

1

主题

64

回帖

149

积分

注册会员

积分
149
发表于 2024-6-18 09:06:55 | 显示全部楼层
每日一回
发表于 2024-6-29 17:58:24 | 显示全部楼层
666666666666666666

1

主题

60

回帖

144

积分

注册会员

积分
144
发表于 2024-7-21 15:56:14 | 显示全部楼层
6666666666

0

主题

71

回帖

143

积分

注册会员

积分
143
发表于 2024-8-13 05:21:32 | 显示全部楼层
6666666666

1

主题

52

回帖

124

积分

注册会员

积分
124
发表于 2024-8-22 09:40:53 | 显示全部楼层
牛逼

1

主题

51

回帖

125

积分

注册会员

积分
125
发表于 2024-8-25 22:35:49 | 显示全部楼层
我不太确定,可能需要再确认一下。
  • 打卡等级:无名新人
  • 打卡总天数:1
  • 打卡月天数:0
  • 打卡总奖励:7
  • 最近打卡:2024-05-05 22:03:52

2

主题

62

回帖

177

积分

注册会员

积分
177
发表于 2024-10-9 22:29:42 | 显示全部楼层
666666666666
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|爱云论坛 - d.taiji888.cn - 技术学习 免费资源分享 ( 蜀ICP备2022010826号 )|天天打卡

GMT+8, 2024-11-24 08:44 , Processed in 0.109345 second(s), 28 queries .

Powered by i云网络 Licensed

© 2023-2028 正版授权

快速回复 返回顶部 返回列表