PHP消息队列的实现方式与详解,值得一看
队列原理:
也是解耦的原理:业务系统和队列处理系统没有关系
一个写(业务系统),一个读(队列管理系统)。
写的只管往队列里写,别的不用操心,读的能不能读完和写的也没有关系
同样,读的只管从队列里往外读,来活儿就干,没活儿歇着
应用场景:
冗余:持久化的存储在队列中,后续由订单处理程序获取,处理完成之后,在把这条记录进行删除
解耦:是解这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消息队列的实现方式与详解,值得一看的更多相关文章
- 基于Raft深度优化,腾讯云金融级消息队列CMQ高可靠算法详解
背景介绍 分布式系统是指一组独立的计算机,通过网络协同工作的系统,客户端看来就如同单台机器在工作.随着互联网时代数据规模的爆发式增长,传统的单机系统在性能和可用性上已经无法胜任,分布式系统具有扩展性强 ...
- JAVA消息服务JMS规范及原理详解
JAVA消息服务JMS规范及原理详解 一.简介 JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应 ...
- python3+requests:post请求四种传送正文方式(详解)
前言:post请求我在python接口自动化2-发送post请求详解(二)已经讲过一部分了,主要是发送一些较长的数据,还有就是数据比较安全等,可以参考Get,Post请求方式经典详解进行学习一下. 我 ...
- 全网最全的Windows下Python2 / Python3里正确下载安装用来向微信好友发送消息的itchat库(图文详解)
不多说,直接上干货! 建议,你用Anaconda2或Anaconda3. 见 全网最全的Windows下Anaconda2 / Anaconda3里正确下载安装用来向微信好友发送消息的itchat库( ...
- Elasticsearch-2.4.3的3节点安装(多种方式图文详解)(含 head、kopf、marvel、shield和watcher插件安装和使用)
前提: Elasticsearch-2.4.3的下载(图文详解) Elasticsearch-2.4.3的单节点安装(多种方式图文详解) 我这里,以192.168.80.10(HadoopMaster ...
- Vue通信、传值的多种方式,详解
Vue通信.传值的多种方式,详解 转自:https://blog.csdn.net/qq_35430000/article/details/79291287 一.通过路由带参数进行传值 ①两个组件 A ...
- python中利用队列asyncio.Queue进行通讯详解
python中利用队列asyncio.Queue进行通讯详解 本文主要给大家介绍了关于python用队列asyncio.Queue通讯的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细 ...
- Vue通信、传值的多种方式,详解(都是干货)
Vue通信.传值的多种方式,详解(都是干货) 可参考博客: https://blog.csdn.net/qq_35430000/article/details/79291287
- 消息队列:快速上手ActiveMQ消息队列的JMS方式使用(两种模式:Topic和Queue的消息推送和订阅)
1.实现功能 希望使用一套API,实现两种模式下的消息发送和接收功能,方便业务程序调用 1.发送Topic 2.发送Queue 3.接收Topic 4.接收Queue 2.接口设计 根据功能设计公共调 ...
随机推荐
- angular post 带参数 导出excel
原文地址:http://www.cnblogs.com/xujanus/p/5985644.html html <button class="btn btn-info" ng ...
- 前端学习 之 Bootstrap(二)
一.代码 内联代码:用<code>包裹,但是需要用<和>表示尖括号. 键盘输入:用<kbd>包裹表示键盘输入的内容. 多行代码:用<pre>包裹多行代码 ...
- 浅析 JavaScript 中的 Function.prototype.bind() 方法
Function.prototype.bind()方法 bind() 方法的主要作用就是将函数绑定至某个对象,bind() 方法会创建一个函数,函数体内this对象的值会被绑定到传入bind() 函数 ...
- HDU1521 排列组合(生成函数 背包)
题意 链接 Sol 可以用生成函数做,也可以用组合数做. 生成函数就是无脑算一下阶乘暴力背包,然后最后再乘上\(M\)的阶乘 组合数的方法就是用类似背包的转移,转移的时候考虑当前放的这几个的方案数即可 ...
- 洛谷P3199 [HNOI2009]最小圈(01分数规划)
题意 题目链接 Sol 暴力01分数规划可过 标算应该是这个 #include<bits/stdc++.h> #define Pair pair<int, double> #d ...
- iPhone照片格式heic图片怎么打开
苹果自iOS11系统之后默认的是heic图片格式,在电脑和安卓中都无法直接查看,需要将其转换图片格式,那苹果heic图片怎么转换成jpg格式?下面我们一起来看看吧! 使用工具:电脑.图片 操作方法: ...
- 【Wyn Enterprise BI知识库】 认识多维数据建模与分析 ZT
与业务系统类似,商业智能的基础是数据.但是,因为关注的重点不同,业务系统的数据使用方式和商业智能系统有较大差别.本文主要介绍的就是如何理解商业智能所需的多维数据模型和多维数据分析. 数据立方体 多维数 ...
- Neutron中插件与代理的总结
1.总结:
- react 的双向数据绑定
学习过angular和vue的人都知道,它俩在实现双向数据绑定都是有一个专门的内置指令ngModel和v-model 但是在react中没有这些. 所以我们在react中想要实现双向数据绑定要调用一个 ...
- matlab练习程序(旋转矩阵、欧拉角、四元数互转)
欧拉角转旋转矩阵公式: 旋转矩阵转欧拉角公式: 旋转矩阵转四元数公式,其中1+r11+r22+r33>0: 四元数转旋转矩阵公式,q0^2+q1^2+q2^2+q3^2=1: 欧拉角转四元数公式 ...