PHP消息队列的实现方式
队列的概念:
1、是队列结构的中间件
2、消息放入后不需要立即处理
3、由订阅者/消费者按顺序处理
队列原理:
也是解耦的原理:业务系统和队列处理系统没有关系
一个写(业务系统),一个读(队列管理系统)。
写的只管往队列里写,别的不用操心,读的能不能读完和写的也没有关系
同样,读的只管从队列里往外读,来活儿就干,没活儿歇着
应用场景:
冗余:持久化的存储在队列中,后续由订单处理程序获取,处理完成之后,在把这条记录进行删除
解耦:是解这2套系统(业务和队列处理),我们平常做的都是一套系统的。入队和出队的系统没有直接的关系,其中一套蹦了,另一套系统不会受影响,因为中间隔了个队列
流量削锋:秒杀和抢购。流量剧增,配合缓存使用消息队列(就是限制下,如 只允许10个,队列里存10个之后就不存了,在来就提示秒杀结束)
异步通信:因为消息本身就可使入队的系统直接返回,所以说实现了程序的异步操作
场景扩展性:如 现在只有订单系统和财务系统,后续我想加个配货系统,直接让配货系统订阅这个队列就可以
排序保证:有些场景下,如 银行数据的处理顺序是很重要的,因为队列本身就可以做成单线程,单进单出的这种系统
实现介质:
1、使用mysql:可靠性高,易实现,速度慢
2、使用redis:速度快,单条大消息包时效率低
3、使用更专业的第三方类库:专业性强,可靠,学习成本高。
请参考我这篇博客http://blog.csdn.net/qq_33862644/article/details/79386484
消息处理触发机制:
1、死循环方式读取:易实现,故障时无法及时回复(适用于秒杀这种短时间的)
2、定时任务:压力均分,有处理上限(无论你队列前的系统,峰值多么不稳定,队列后的系统依然会定时执行)
注意:定时时间是个关键:不要上一个还定时任务没执行完,下一个定时任务就启动了
案例:订单系统,下单后将订单信息写入队列后,立刻返回下单成功。配货系统每隔几分钟定时读取队列,对订单进行汇总处理
3、守护进程:类似于php-fpm和cgi,需要shell基础(用这个进程来检测,队列中是否有内容,有内容的话,启动出队系统进行处理)
使用mysql实现解耦案例:
为什么要解耦:如果架构在一起。订单系统压力大,而物流信息是不需要立刻返回的。订单崩了,物流也就蹦了,所以要解耦
表的设计:
订单系统写入队列的代码:
配货系统读取队列的代码:
执行定时任务Crontab -e
注意:这日志文件要自己新建
1、通过浏览器访问order.php添加订单
2、去数据库看结果,在shell中的日志中看结果(没有执行成功,可能是这sh文件需要放在某个特点目录吧,等复习完 在跑)
使用redis进行流量削锋案例
思路:
1、秒杀程序请求写入redis
2、检查redis已存放数据的长度,超出上限直接丢弃(返回秒杀结束)
3、死循环处理存入redis的数据并入库
表的设计:
秒杀代码:
入库代码:
浏览器直接访问user.php
在shell中使用php -f savetodb.php
去数据库查看
转载自公众号
PHP消息队列的实现方式相关推荐
- 消息队列相关使用方式
消息队列:Message Queue java消息队列基础理解 https://www.cnblogs.com/carsonwuu/p/10399527.html kafka消息生产产者图 https ...
- activeMQ消息队列(xml方式)
一.项目搭建(spring+activeMQ环境) 导包: <!-- 消息队列 MQ --><dependency><groupId>org.apache.acti ...
- 消息队列的其他实现方式
在 Redis 5.0 之前消息队列的实现方式有很多种,比较常见的除了我们上文介绍的发布订阅模式,还有两种:List 和 ZSet 的实现方式. List 和 ZSet 的方式解决了发布订阅模式不能持 ...
- STM32 FreeRTOS USART DMA空闲中断和消息队列的使用
(后文有修改) 一.思路 USART+DMA空闲中断发生后,将接收到的DMA消息用消息队列发出去xQueueSendToFrontFromISR,FreeRTOS创建一个独立的任务一直等待接受消息队列 ...
- MSMQ(MicroSoft Message Queue,微软消息队列)
MSMQ(MicroSoft Message Queue,微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任一位 ...
- Redis 消息队列的三种方案(List、Streams、Pub/Sub)
现如今的互联网应用大都是采用 分布式系统架构 设计的,所以 消息队列 已经逐渐成为企业应用系统 内部通信 的核心手段,它具有 低耦合.可靠投递.广播.流量控制.最终一致性 等一系列功能. 当前使用较多 ...
- 消息队列终极解决方案——Stream(上)
在 Redis 5.0 Stream 没出来之前,消息队列的实现方式都有着各自的缺陷,例如: 发布订阅模式 PubSub,不能持久化也就无法可靠的保存消息,并且对于离线重连的客户端不能读取历史消息的缺 ...
- msgget();msgsnd();msgrcv();msgctl(); 消息队列 Linux进程间的通信方式之消息队列
Linux进程间的通信方式 ----消息队列. 消息队列和共享内存类似 消息队列它允许一个或多个进程向它写消息,一个或多个进程向它写读消息. 消息队列存在于系统内核中,消息的数量受系统限制. 我们来看 ...
- java 消息队列_JAVA-消息队列
一.消息队列的作用 1.在某些时候,会突然有许多用户发出请求,就比如某宝搞活动,这时候,服务器就会同时处理复数的请求,可能会出现响应超时的问题,轻则服务器假死,重则直接宕机.而消息队列,可以在服务器接 ...
- 消息队列mq的原理及实现方法
消息队列技术是分布式应用间交换信息的一种技术.消息队列可驻留在内存或磁盘上,队列存储消息直到它们被应用程序读走.通过消息队列,应用程序可独立地执行--它们不需要知道彼此的位置.或在继续执行前不需要等待 ...
最新文章
- 对称加密DES和TripleDES
- Java动态代理代码案例:使用jdk自带的Proxy只能对有接口的类进行动态代理
- js如何实现扫描身份证识别_如何识别身份证上信息?快速录入看这招
- VUE安装依赖命令总结
- 导入一个android项目需要改什么意思,导入别人的Android Studio项目前要修改的文件...
- ActiveMQ入门实例
- pushpop指令的操作数必须是字操作数_PLC的指令,电气人必须了解的基础内容
- Multi GET API介绍
- Linux(Ubuntu)内存查询top命令详解
- 【注意力机制】SENet(Squeeze-and-Excitation Networks)详解
- 《季羡林先生》读书笔记-3
- 官方实锤!微软宣布以 75 亿美元收购 GitHub
- 用十句简单英语激活你的口语
- 深化代理模式,Mybaits如何做到调用接口
- Java基础:MySQL
- 使用stress,压力测试K8S的POD cpu
- 下载站源码 php,thinkphp开发素材资源源码下载站整站源代码
- rs232接口_为什么越来越多人用RS232接口,却还分不清DB9、DB25的引脚定义?
- Ignite 架构全面解析
- 适用于 Windows 10 的触摸板手势
热门文章
- 单模光纤最大传输距离为多少_单模光纤传输距离是多少?
- linux怎么看用的哪个网卡驱动,linux下如何查看网卡驱动版本信息?
- gif一键抠图 在线_在线抠图网站大全
- Linux压缩与解压缩文件或文件夹命令
- gitee创建仓库,并将代码上传到gitee上
- xp系统打印机服务器报错,win10系统连接xp系统共享打印机报错0x000004的具体方法...
- 内网,外网ip(路由器ip,公网ip)的分别以及如何查询
- git clone 的--single-branch和--depth参数
- python改变图片透明度_Python PIL.Image之修改图片背景为透明
- 大学物理笔记——第二章质点动力学