以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.简单模式
简单模式是最简单的使用方式,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.工作模式
它由一个生产者发送在队列中,work队列会分配消息给不同的消费者,让每个消费者接收到不同的消息。
工作模式的场景特别适合集群模式的异步处理,最大程度发挥每一台服务器的性能。
3.订阅模式
从订阅模式开始就使用了交换机,订阅模式使用了广播类型的交换机,它会让每个队列的消息都是一样的。
生产者把消息发送给交换机,交换机把消息发送给和它绑定的队列,让消费者来消费,需要强调的是绑定的队列获得的消息是一模一样的,订阅模式就是让所有的消费者获得相同的消息。
订阅模式使用场景,天气、微博的订阅,收费文章的订阅等等。
生产者实现:
$channel->exchange_declare('logs', 'fanout', false, false, false);
# 绑定交换机和队列
$channel->queue_bind($queue_name, 'logs');
交换机参数详解:
交换机名
交换机类型
检查是否存在
是否持久化
是否自动删除
$channel->basic_publish($msg, '这里是交换机的名字', $queueName);
消费者和生产者一样,先绑定交换机:
4.路由模式
路由模式使用direct定向类型的交换机,生产者发送一个消息到交换机,交换机根据发送来的路由键发送到相匹配的队列中,来和队列绑定的消费者进行消费。
订阅模式和路由模式的区别,订阅模式无条件的把消息发送给所有的消费者,每一个消费者收到的消息都是一样的,而路由模式对消息进行筛选发送给对应的消费者队列。
5.主题模式
主题模式采用的事topic的交换机,通过通配符进行匹配,通配符主要有*
和#
。
6.RPC模式
RabbitMQ的RPC模式,支持生产者和消费者不在同一个系统中,即允许远程调用的情况。通常,消费者作为服务端,放置在远程的系统中,提供接口,生产者调用接口,并发送消息。
RPC模式是一种远程调用的模式,因为需要http请求,因此速度比系统内部调用慢。而且rpc模式下,通常不易区分哪些是来自外部的请求,哪些是内部的请求,导致整体速度较慢。因此,不能滥用rpc模式。
最后
后面的3个模式不做详细的代码讲解了,可以看参考官网,实现起来都是差不多的。
官网:www.rabbitmq.com/getstarted.…
来源:https://juejin.cn/post/7230395983917547581


猜你喜欢
- 最近读到一篇关于 Go 反射的文章,作者通过反射给结构体填充字段值的案例,充分利用 Go 的各种内在机理,逐步探讨让代码运行得更快的姿势。文
- 也不一定,以前从来没有深入的研究过sql查询,最近买了一本T-SQL查询的书,把以前忽视的问题都记录一下 以前一直模模糊糊的把sqlserv
- 1.安装pymysql进入cmd,输入 pip install pymysql: 2.数据库建表在数据库中,建立一个简单的表,如图: 3.简
- 获取nc数据的相关信息from netCDF4 import Datasetimport numpy as npimport pandas
- 本文实例讲述了PHP面向对象继承用法。分享给大家供大家参考,具体如下:继承先看两个类<?phpclass CdProduct { &n
- 用df命令查了下,果然磁盘满了,因为当时分区采用系统默认,不知道为什么不能自动扩容!以后在处理这个问题!如图所示:[root@snsgou
- 一、数据集小企鹅数据集,提取码:1234该数据集一共包含8个变量,其中7个特征变量,1个目标分类变量。共有150个样本,目标变量为 企鹅的类
- 1.今天在看JavaScript学习指南的时候做的课后习题,也因此详细的对函数的传入参数进行比较深入的研究.题目如下:函数如何才能修改其作用
- 本章我们来实现一下折线图,有了画柱状图的经验,我们可以快速的分析出柱状图和折线图的区别主要是x轴比例尺和绘制数据图形,其余的画布,坐标轴等,
- 我相信一定有很多的人跟我一样,经常忘记Python安装的路径,每当用到的时候,最笨的办法就是在全局电脑里,直接查找Python,这样是肯定能
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&
- 一、python线程的模块1.1 thread和threading模块thread模块提供了基本的线程和锁的支持threading提供了更高
- 在我们处理文件的时候,会遇到这样的一种场景,我们需要对某个文件进行操作,然后生成与原文件名相同的文件(只是文件格式改变)。那么这个时候就可以
- 导航设计是结构层面设计中的主要工作之一,在软件中,导航设计的好坏,直接关系到用户使用是否能够流畅。面对较复杂的导航,我们第一反应是将其简化。
- 1,IE使用attachEvent/detachEvent方法来添加和删除事件 * ;w3c使用addEventListener/remov
- 一、概述OpenCV在V4.5.3版本的contrib包中提供了一个barcode::BarcodeDetector类,用于条形码的识别。二
- 背景在开发中,我们常常会遇到一些耗时任务,举个例子:上传并解析一个 1w 条数据的 Excel 文件,最后持久化至数据库。在我的程序中,这个
- 解决方法: 给 audio 组件绑定点击事件,手动触发播放暂停方法!代码片段:wxml文件<!-- 判断是语音通话,有通话记录,通话描
- 基础知识介绍以SQL Server的数据库管理工具SSMS(SQL Server Management Studio)为平台进行操作。SQL
- 最近看到了两行 JavaScript 代码,很受启发。1. 封装 DOM 属性在 JavaScript 中,我们可以获取HTML元素的属性值