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消息队列的应用

  1. 安装php-amqplib
➜ mkdir rabbitmq-demo
➜ composer init
➜ composer require php-amqplib/php-amqplib
  1. 创建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应用相关推荐

  1. RabbitMQ 入门系列(11)— RabbitMQ 常用的工作模式(simple模式、work模式、publish/subscribe模式、routing模式、topic模式)

    1. simple 模式 simple 模式是最简单最常用的模式 2. work 模式 work 模式有多个消费者 消息产生者将消息放入队列.生产者系统不需知道哪一个任务执行系统在空闲,直接将任务扔到 ...

  2. Go 学习笔记(57)— Go 第三方库之 amqp (RabbitMQ 生产者、消费者整个流程)

    1. 安装 rabbitmq 的 golang 包 golang 可使用库 github.com/streadway/amqp 操作 rabbitmq .使用下面命令安装 RabbitMQ . go ...

  3. RabbitMQ 入门系列(4)— RabbitMQ 启动、停止节点和应用程序、用户管理、权限配置

    1. 服务器管理 我们使用 "节点" 来指代 RabbitMQ 实例,当我们谈到 RabbitMQ 节点时指的是 RabbitMQ 应用程序和其所在的 Erlang 节点. 1.1 ...

  4. RabbitMQ 入门系列(3)— 生产者消费者 Python 代码实现

    生产者消费者代码示例 上一章节中对消息通信概念做了详细的说明,本章节我们对 RabbitMQ 生产者和消费者代码分别做一示例说明. 1. 生产者代码 #!/usr/bin/env python # c ...

  5. RabbitMQ 入门系列(2)— 生产者、消费者、信道、代理、队列、交换器、路由键、绑定、交换器

    本系列是「RabbitMQ实战:高效部署分布式消息队列」和 「RabbitMQ实战指南」书籍的读书笔记. RabbitMQ 中重要概念 1. 生产者 生产者(producer)创建消息,然后发送到代理 ...

  6. RabbitMQ 入门系列(1)— Ubuntu 安装 RabbitMQ 及配置

    1. RabbitMQ 简介 消息 (Message) 是指在应用间传送的数据.消息可以非常简单,比如只包含文本字符串.JSON等,也可以很复杂,比如内嵌对象. 消息队列中间件(Message Que ...

  7. RabbitMQ超详细安装教程(Linux)

    目录 1.简介 2.下载安装启动RabbitMQ 2.1.下载RabbitMQ 2.2.下载Erlang 2.3.安装Erlang 2.4.安装RabbitMQ 2.5.启动RabbitMQ服务 3. ...

  8. 第五节 RabbitMQ在C#端的应用-消息收发

    原文:第五节 RabbitMQ在C#端的应用-消息收发 版权声明:未经本人同意,不得转载该文章,谢谢 https://blog.csdn.net/phocus1/article/details/873 ...

  9. RabbitMQ学习笔记一:本地Windows环境安装RabbitMQ Server

    一:安装RabbitMQ需要先安装Erlang语言开发包,百度网盘地址:http://pan.baidu.com/s/1jH8S2u6.直接下载地址:http://erlang.org/downloa ...

  10. RabbitMQ使用及与spring boot整合

    1.MQ 消息队列(Message Queue,简称MQ)--应用程序和应用程序之间的通信方法 应用:不同进程Process/线程Thread之间通信 比较流行的中间件: ActiveMQ Rabbi ...

最新文章

  1. Vue:Elementui中的Tag与页面其它元素相互交互的两三事
  2. Android系统Recovery工作原理之使用update.zip升级过程分析(五)
  3. RaySync 传输协议的有效带宽利用率分析介绍
  4. Flutter 异常处理之图片篇
  5. JUnit简单使用教程
  6. 解释三度带和六度带的概念以及各坐标系如何定义
  7. 14个支持响应式设计的流行前端开发框架
  8. 关于Visual C#.NET数据库开发经典案例解析(附光盘两张)(珍藏版)—的读后感...
  9. Tomcat10 端口修改 Linux 环境
  10. PHP 正在干掉 Python
  11. 激怒开源社区,微软悄悄删除2500行功能代码后致歉:已恢复!
  12. 有点火的程序秒收录牛X
  13. Python学习笔记--Python字符串连接方法总结
  14. LeetCode 852 Peak Index in a Mountain Array 解题报告
  15. 基于JavaWeb实现网上图书商城系统
  16. 鲁大师2014 v3.75.14.1058 官方版
  17. 音频处理与压缩技术漫谈
  18. 接入Paypal 实现跨境支付 - springboot实战电商项目mall4j
  19. win8.1装载windows和linux双系统
  20. App渗透中常见的加密与解密

热门文章

  1. 用Pytest+Allure生成漂亮的HTML图形化测试报告(废弃)
  2. 已解决AttributeError: module ‘tkinter‘ has no attribute ‘TK
  3. Struts2 S2-016/S2-017 命令执行带回显、看web路径、getshell e...
  4. python珠穆朗玛峰问题_珠穆朗玛峰有多可怕?看沿途看完就明白了!
  5. 教师计算机基础知识培训简报,信息技术能力提升培训简报.doc
  6. 苹果注定要输给欧盟,USB-C成为标准接口已是大势所趋
  7. 力扣(LeetCode)剑指offer刷题笔记(java),已完结!!!
  8. Spark快速大数据分析——Scala语言基础(壹)
  9. 计算机专业规划书实地访谈,计算机专业职业生涯规划书(1).doc
  10. C#访问局域网内共享文件夹