RabbitMQ与PHP应用
RabbitMQ与PHP应用
简介
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来连接它们。
消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。
排队指的是应用程序通过 队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。
RabbitMQ is a message broker: it accepts and forwards messages. You can think about it as a post office: when you put the mail that you want posting in a post box, you can be sure that the letter carrier will eventually deliver the mail to your recipient. In this analogy, RabbitMQ is a post box, a post office, and a letter carrier.
翻译:RabbitMQ 是一个消息代理:它接受和转发消息。 您可以将其视为邮局:当您将要邮寄的邮件放入邮箱时,您可以确定邮递员最终会将邮件递送给您的收件人。 在这个类比中,RabbitMQ 是一个邮箱、一个邮局和一个邮递员。
RabbitMQ场景
1. 解藕
订单系统:用户下单后需要通知库存系统。
传统做法:订单系统调用库存系统的API(一般直接操作数据库)
缺点:
- 订单系统和库存系统耦合
- 高并发情况下会给库存系统造成巨大的请求压力 (性能不佳甚至宕机)
- 如果库存系统无法访问(宕机等)导致库存系统库存减失败,从而导致订单系统失败
引入消息队列(RabbitMQ):
- 订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功
- 库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作
- 假如:在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦
- 为了保证库存肯定有,可以将队列大小设置成库存数量,或者采用其他方式解决。
基于消息的模型,关心的是“通知”,而非“处理”
短信、邮件通知、缓存刷新等操作使用消息队列进行通知
消息队列和RPC的区别与比较:
RPC: 异步调用,及时获得调用结果,具有强一致性结果,关心业务调用处理结果。
消息队列:两次异步RPC调用,将调用内容在队列中进行转储,并选择合适的时机进行投递(错峰流控)
2. 异步提升效率
场景:短信、邮件发送
用户注册成功之后,需要发送短信和邮件通知。传统的做法有两种 1.串行的方式;2.并行方式
串行的方式: 处理周期长
并行方式: 相比较串行的方式,可以提升处理时间
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nmFGtIAI-1647653011972)(http://images.caixiaoxin.cn/1645247756341.jpg)]
引入消息队列 将发送邮件、短信不必要的业务逻辑异步处理,减少处理周期,减轻数据库压力,提升性能
3. 流量削峰
流量削锋也是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛
应用场景:系统其他时间A系统每秒请求量就100个,系统可以稳定运行。系统每天晚间八点有秒杀活动,每秒并发请求量增至1万条,但是系统最大的处理能力只能每秒处理1000个请求,于是系统崩溃,服务器宕机。
之前架构:大量用户(100万用户)通过浏览器在晚上八点高峰期同时参与秒杀活动。大量的请求涌入我们的系统中,高峰期达到每秒钟5000个请求,大量的请求打到MySQL上,每秒钟预计执行3000条SQL。
但是一般的MySQL每秒钟扛住2000个请求就不错了,如果达到3000个请求的话可能MySQL直接就瘫痪了,从而系统无法被使用。但是高峰期过了之后,就成了低峰期,可能也就1万用户访问系统,每秒的请求数量也就50个左右,整个系统几乎没有任何压力。
引入MQ:100万用户在高峰期的时候,每秒请求有5000个请求左右,将这5000请求写入MQ里面,系统A每秒最多只能处理2000请求,因为MySQL每秒只能处理2000个请求。
系统A从MQ中慢慢拉取请求,每秒就拉取2000个请求,不要超过自己每秒能处理的请求数量即可。MQ,每秒5000个请求进来,结果只有2000个请求出去,所以在秒杀期间(将近一小时)可能会有几十万或者几百万的请求积压在MQ中。
这个短暂的高峰期积压是没问题的,因为高峰期过了之后,每秒就只有50个请求进入MQ了,但是系统还是按照每秒2000个请求的速度在处理,所以说,只要高峰期一过,系统就会快速将积压的消息消费掉。
引入消息队列的优缺点
优点:
在特殊场景下有其对应的好处,解耦、异步、削峰
缺点:
系统的可用性降低
系统引入的外部依赖越多,系统越容易挂掉,本来只是A系统调用BCD三个系统接口就好,ABCD四个系统不报错整个系统会正常运行。引入了MQ之后,虽然ABCD系统没出错,但MQ挂了以后,整个系统也会崩溃。系统的复杂性提高
引入了MQ之后,需要考虑的问题也变得多了,如何保证消息没有重复消费?如何保证消息不丢失?怎么保证消息传递的顺序?一致性问题
A系统发送完消息直接返回成功,但是BCD系统之中若有系统写库失败,则会产生数据不一致的
PHP - RabbitMQ消息队列的应用
- 安装php-amqplib
➜ mkdir rabbitmq-demo
➜ composer init
➜ composer require php-amqplib/php-amqplib
- 创建receiver.php和send.php
<?phprequire_once __DIR__ . '/vendor/autoload.php';use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;$queue = 'order-sys';$connection = new AMQPStreamConnection('localhost',5672,"admin","admin",'my-rabbitmq-vhost'
);$channel = $connection->channel();$channel->queue_declare($queue, false, true, false, false);for ($i = 0; $i <= 100; $i++) {$arr = ['id' => 'message_' . $i,'order_id' => str_replace('.', '', microtime(true) . mt_rand(10, 99)) . $i,'content' => 'content-' . time(),];$data = json_encode($arr);$msg = new AMQPMessage($data, ['delivery_mode' => AMQPMessage::DELIVERY_MODE_NON_PERSISTENT]);$channel->basic_publish($msg, '', $queue);echo 'Send message: ' . $data .PHP_EOL;
}$channel->close();
$connection->close();
receive.php
<?phprequire_once __DIR__ . '/vendor/autoload.php';use PhpAmqpLib\Connection\AMQPStreamConnection;$queue = 'order-sys';$connection = new AMQPStreamConnection('localhost',5672,'admin','admin','my-rabbitmq-vhost'
);$channel = $connection->channel();$channel->queue_declare($queue, false, true, false, false);echo ' [*] Waiting for messages. To exit press CTRL+C ' . PHP_EOL;$callback = function ($msg) {echo " Received message:", $msg->body, PHP_EOL;sleep(1);$msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);
};$channel->basic_qos(null, 1, null); //处理和确认完消息后再消费新的消息
$channel->basic_consume($queue, '', false, false, false, false, $callback);while (count($channel->callbacks)) {$channel->wait();
}$channel->close();
$connection->close();
RabbitMQ与PHP应用相关推荐
- RabbitMQ 入门系列(11)— RabbitMQ 常用的工作模式(simple模式、work模式、publish/subscribe模式、routing模式、topic模式)
1. simple 模式 simple 模式是最简单最常用的模式 2. work 模式 work 模式有多个消费者 消息产生者将消息放入队列.生产者系统不需知道哪一个任务执行系统在空闲,直接将任务扔到 ...
- Go 学习笔记(57)— Go 第三方库之 amqp (RabbitMQ 生产者、消费者整个流程)
1. 安装 rabbitmq 的 golang 包 golang 可使用库 github.com/streadway/amqp 操作 rabbitmq .使用下面命令安装 RabbitMQ . go ...
- RabbitMQ 入门系列(4)— RabbitMQ 启动、停止节点和应用程序、用户管理、权限配置
1. 服务器管理 我们使用 "节点" 来指代 RabbitMQ 实例,当我们谈到 RabbitMQ 节点时指的是 RabbitMQ 应用程序和其所在的 Erlang 节点. 1.1 ...
- RabbitMQ 入门系列(3)— 生产者消费者 Python 代码实现
生产者消费者代码示例 上一章节中对消息通信概念做了详细的说明,本章节我们对 RabbitMQ 生产者和消费者代码分别做一示例说明. 1. 生产者代码 #!/usr/bin/env python # c ...
- RabbitMQ 入门系列(2)— 生产者、消费者、信道、代理、队列、交换器、路由键、绑定、交换器
本系列是「RabbitMQ实战:高效部署分布式消息队列」和 「RabbitMQ实战指南」书籍的读书笔记. RabbitMQ 中重要概念 1. 生产者 生产者(producer)创建消息,然后发送到代理 ...
- RabbitMQ 入门系列(1)— Ubuntu 安装 RabbitMQ 及配置
1. RabbitMQ 简介 消息 (Message) 是指在应用间传送的数据.消息可以非常简单,比如只包含文本字符串.JSON等,也可以很复杂,比如内嵌对象. 消息队列中间件(Message Que ...
- RabbitMQ超详细安装教程(Linux)
目录 1.简介 2.下载安装启动RabbitMQ 2.1.下载RabbitMQ 2.2.下载Erlang 2.3.安装Erlang 2.4.安装RabbitMQ 2.5.启动RabbitMQ服务 3. ...
- 第五节 RabbitMQ在C#端的应用-消息收发
原文:第五节 RabbitMQ在C#端的应用-消息收发 版权声明:未经本人同意,不得转载该文章,谢谢 https://blog.csdn.net/phocus1/article/details/873 ...
- RabbitMQ学习笔记一:本地Windows环境安装RabbitMQ Server
一:安装RabbitMQ需要先安装Erlang语言开发包,百度网盘地址:http://pan.baidu.com/s/1jH8S2u6.直接下载地址:http://erlang.org/downloa ...
- RabbitMQ使用及与spring boot整合
1.MQ 消息队列(Message Queue,简称MQ)--应用程序和应用程序之间的通信方法 应用:不同进程Process/线程Thread之间通信 比较流行的中间件: ActiveMQ Rabbi ...
最新文章
- Vue:Elementui中的Tag与页面其它元素相互交互的两三事
- Android系统Recovery工作原理之使用update.zip升级过程分析(五)
- RaySync 传输协议的有效带宽利用率分析介绍
- Flutter 异常处理之图片篇
- JUnit简单使用教程
- 解释三度带和六度带的概念以及各坐标系如何定义
- 14个支持响应式设计的流行前端开发框架
- 关于Visual C#.NET数据库开发经典案例解析(附光盘两张)(珍藏版)—的读后感...
- Tomcat10 端口修改 Linux 环境
- PHP 正在干掉 Python
- 激怒开源社区,微软悄悄删除2500行功能代码后致歉:已恢复!
- 有点火的程序秒收录牛X
- Python学习笔记--Python字符串连接方法总结
- LeetCode 852 Peak Index in a Mountain Array 解题报告
- 基于JavaWeb实现网上图书商城系统
- 鲁大师2014 v3.75.14.1058 官方版
- 音频处理与压缩技术漫谈
- 接入Paypal 实现跨境支付 - springboot实战电商项目mall4j
- win8.1装载windows和linux双系统
- App渗透中常见的加密与解密
热门文章
- 用Pytest+Allure生成漂亮的HTML图形化测试报告(废弃)
- 已解决AttributeError: module ‘tkinter‘ has no attribute ‘TK
- Struts2 S2-016/S2-017 命令执行带回显、看web路径、getshell e...
- python珠穆朗玛峰问题_珠穆朗玛峰有多可怕?看沿途看完就明白了!
- 教师计算机基础知识培训简报,信息技术能力提升培训简报.doc
- 苹果注定要输给欧盟,USB-C成为标准接口已是大势所趋
- 力扣(LeetCode)剑指offer刷题笔记(java),已完结!!!
- Spark快速大数据分析——Scala语言基础(壹)
- 计算机专业规划书实地访谈,计算机专业职业生涯规划书(1).doc
- C#访问局域网内共享文件夹