以PHP代码为实例详解RabbitMQ消息队列中间件的6种模式

作者:stark张宇 时间:2023-06-08 12:15:53 

RabbitMQ 6种工作模式

对RabbitMQ 6种工作模式(简单模式、工作模式、订阅模式、路由模式、主题模式、RPC模式)进行场景和参数进行讲解,PHP代码作为实例。

安装

客户端实现:添加扩展,执行composer.phar install命令

{
   "require": {
       "php-amqplib/php-amqplib": ">=3.0"
   }
}

引入包

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

建立一个链接,

# 链接服务
$connection = new AMQPStreamConnection('127.0.0.1', 5672, 'stark', '1990@stark');
$channel = $connection->channel();
$channel->queue_declare('hello', false, false, false, false);
$msg = new AMQPMessage('Hello World!');
$channel->basic_publish($msg, '', 'hello');
echo " [x] Sent 'Hello World!'\n";
# 关闭信道和链接
$channel->close();
$connection->close();

6种模式

1.简单模式

以PHP代码为实例详解RabbitMQ消息队列中间件的6种模式

简单模式是最简单的使用方式,P代表生产者,C代表消费者,红色的代表队列,执行过程生产者发送消息到队列,右面的消费者消费消息,需要注意的是这里没有交换机。

生产者代码(PHP)

# 声明队列
$queueName = 'MqName';
$channel->queue_declare($queueName, false, false, false, false);

queue_declare 参数说明:

  • 队列名

  • 检测队列是否存在,true只检测不创建,false会创建

  • 是否持久化队列,true持久化

  • 是否私有队列 true代表私有

  • 当消费者断开后,队列是否自动删除

# 创建AMQP消息类型
$msg = new AMQPMessage($data,
           array('delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT)
       );

AMQPMessage 参数说明: 1.消息体 2.是否持久化

$channel->basic_publish($msg, '', $queueName);

basic_publish参数详解:

  • 发送内容

  • 交换机名称,简单模式没有使用交换机

  • 队列名称

消费者代码:

$channel->basic_consume('hello', '', false, true, false, false, $callback);
# 阻塞队列,做监听
while ($channel->is_open()) {
   $channel->wait();
}

basic_consume 参数说明:

  • 队列名

  • 消费者标签

  • AMQP标准

  • 是否自动应答 ack true 自动应答,false应答

  • 是否排他

  • ?

  • 回调函数

2.工作模式

以PHP代码为实例详解RabbitMQ消息队列中间件的6种模式

它由一个生产者发送在队列中,work队列会分配消息给不同的消费者,让每个消费者接收到不同的消息。

工作模式的场景特别适合集群模式的异步处理,最大程度发挥每一台服务器的性能。

3.订阅模式

以PHP代码为实例详解RabbitMQ消息队列中间件的6种模式

从订阅模式开始就使用了交换机,订阅模式使用了广播类型的交换机,它会让每个队列的消息都是一样的。

生产者把消息发送给交换机,交换机把消息发送给和它绑定的队列,让消费者来消费,需要强调的是绑定的队列获得的消息是一模一样的,订阅模式就是让所有的消费者获得相同的消息。

订阅模式使用场景,天气、微博的订阅,收费文章的订阅等等。

生产者实现:

$channel->exchange_declare('logs', 'fanout', false, false, false);
# 绑定交换机和队列
$channel->queue_bind($queue_name, 'logs');

交换机参数详解:

  • 交换机名

  • 交换机类型

  • 检查是否存在

  • 是否持久化

  • 是否自动删除

$channel->basic_publish($msg, '这里是交换机的名字', $queueName);

消费者和生产者一样,先绑定交换机:

4.路由模式

以PHP代码为实例详解RabbitMQ消息队列中间件的6种模式

路由模式使用direct定向类型的交换机,生产者发送一个消息到交换机,交换机根据发送来的路由键发送到相匹配的队列中,来和队列绑定的消费者进行消费。

订阅模式和路由模式的区别,订阅模式无条件的把消息发送给所有的消费者,每一个消费者收到的消息都是一样的,而路由模式对消息进行筛选发送给对应的消费者队列。

5.主题模式

以PHP代码为实例详解RabbitMQ消息队列中间件的6种模式

主题模式采用的事topic的交换机,通过通配符进行匹配,通配符主要有*#

6.RPC模式

RabbitMQ的RPC模式,支持生产者和消费者不在同一个系统中,即允许远程调用的情况。通常,消费者作为服务端,放置在远程的系统中,提供接口,生产者调用接口,并发送消息。

RPC模式是一种远程调用的模式,因为需要http请求,因此速度比系统内部调用慢。而且rpc模式下,通常不易区分哪些是来自外部的请求,哪些是内部的请求,导致整体速度较慢。因此,不能滥用rpc模式。

最后

后面的3个模式不做详细的代码讲解了,可以看参考官网,实现起来都是差不多的。

  • 官网:www.rabbitmq.com/getstarted.…

来源:https://juejin.cn/post/7230395983917547581

标签:php实例,RabbitMQ,模式,消息队列,中间件
0
投稿

猜你喜欢

  • Python3自动安装第三方库,跟pip说再见

    2022-03-12 04:34:15
  • Python实现视频中添加音频工具详解

    2022-06-03 12:32:28
  • 关于python中逆序的三位数

    2021-08-09 05:17:28
  • Python实现网络聊天室的示例代码(支持多人聊天与私聊)

    2022-11-21 15:17:23
  • python中序列的逆序方式

    2023-12-12 19:49:07
  • python用pyecharts画矩形树图实例

    2022-12-20 21:42:04
  • Active Server Pages 错误 ASP 0201 修复方法

    2011-03-06 10:41:00
  • Python Pandas数据中对时间的操作

    2023-06-10 00:50:57
  • 在PyCharm的 Terminal(终端)切换Python版本的方法

    2021-10-31 08:37:07
  • MySQL使用LVM快照实现备份

    2024-01-26 20:21:17
  • 防止表单重复提交的巧妙方法

    2009-03-09 18:32:00
  • Python 内置变量和函数的查看及说明介绍

    2021-06-11 16:12:14
  • 在pytorch中对非叶节点的变量计算梯度实例

    2021-08-26 10:13:53
  • SpringBoot整合Mysql和Redis的详细过程

    2024-01-27 02:18:01
  • 将ASP纪录集输出成n列表格的方法

    2008-03-19 13:27:00
  • face_recognition库在python的安装

    2021-06-16 02:29:27
  • MySQL 的启动选项和系统变量实例详解

    2024-01-23 06:04:52
  • GO语言入门Golang进入HelloWorld

    2024-05-09 09:32:12
  • Python基础教程(一)——Windows搭建开发Python开发环境

    2021-06-16 13:41:53
  • PHPMyadmin2.10中文显示为乱码的解决办法

    2007-08-22 08:18:00
  • asp之家 网络编程 m.aspxhome.com