队列原理:

也是解耦的原理:业务系统和队列处理系统没有关系

一个写(业务系统),一个读(队列管理系统)。

写的只管往队列里写,别的不用操心,读的能不能读完和写的也没有关系

同样,读的只管从队列里往外读,来活儿就干,没活儿歇着

应用场景:

冗余:持久化的存储在队列中,后续由订单处理程序获取,处理完成之后,在把这条记录进行删除

解耦:是解这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消息队列的实现方式与详解,值得一看的更多相关文章

  1. 基于Raft深度优化,腾讯云金融级消息队列CMQ高可靠算法详解

    背景介绍 分布式系统是指一组独立的计算机,通过网络协同工作的系统,客户端看来就如同单台机器在工作.随着互联网时代数据规模的爆发式增长,传统的单机系统在性能和可用性上已经无法胜任,分布式系统具有扩展性强 ...

  2. JAVA消息服务JMS规范及原理详解

    JAVA消息服务JMS规范及原理详解 一.简介 JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应 ...

  3. python3+requests:post请求四种传送正文方式(详解)

    前言:post请求我在python接口自动化2-发送post请求详解(二)已经讲过一部分了,主要是发送一些较长的数据,还有就是数据比较安全等,可以参考Get,Post请求方式经典详解进行学习一下. 我 ...

  4. 全网最全的Windows下Python2 / Python3里正确下载安装用来向微信好友发送消息的itchat库(图文详解)

    不多说,直接上干货! 建议,你用Anaconda2或Anaconda3. 见 全网最全的Windows下Anaconda2 / Anaconda3里正确下载安装用来向微信好友发送消息的itchat库( ...

  5. Elasticsearch-2.4.3的3节点安装(多种方式图文详解)(含 head、kopf、marvel、shield和watcher插件安装和使用)

    前提: Elasticsearch-2.4.3的下载(图文详解) Elasticsearch-2.4.3的单节点安装(多种方式图文详解) 我这里,以192.168.80.10(HadoopMaster ...

  6. Vue通信、传值的多种方式,详解

    Vue通信.传值的多种方式,详解 转自:https://blog.csdn.net/qq_35430000/article/details/79291287 一.通过路由带参数进行传值 ①两个组件 A ...

  7. python中利用队列asyncio.Queue进行通讯详解

    python中利用队列asyncio.Queue进行通讯详解 本文主要给大家介绍了关于python用队列asyncio.Queue通讯的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细 ...

  8. Vue通信、传值的多种方式,详解(都是干货)

    Vue通信.传值的多种方式,详解(都是干货) 可参考博客: https://blog.csdn.net/qq_35430000/article/details/79291287

  9. 消息队列:快速上手ActiveMQ消息队列的JMS方式使用(两种模式:Topic和Queue的消息推送和订阅)

    1.实现功能 希望使用一套API,实现两种模式下的消息发送和接收功能,方便业务程序调用 1.发送Topic 2.发送Queue 3.接收Topic 4.接收Queue 2.接口设计 根据功能设计公共调 ...

随机推荐

  1. java多线程高并发

    旭日Follow_24 的CSDN 博客 ,全文地址请点击: https://blog.csdn.net/xuri24/article/details/81293321 “高并发和多线程”总是被一起提 ...

  2. 2018年,JavaScript都经历了什么?

    摘要: 对JSer来说,这是很有意思的1年. 本文灵感来自JavaScript Weekly周报,欢迎大家订阅. The State of JavaScript 2018 The State of J ...

  3. BZOJ4805: 欧拉函数求和(杜教筛)

    4805: 欧拉函数求和 Time Limit: 15 Sec  Memory Limit: 256 MBSubmit: 614  Solved: 342[Submit][Status][Discus ...

  4. iPhone照片格式heic图片怎么打开

    苹果自iOS11系统之后默认的是heic图片格式,在电脑和安卓中都无法直接查看,需要将其转换图片格式,那苹果heic图片怎么转换成jpg格式?下面我们一起来看看吧! 使用工具:电脑.图片 操作方法: ...

  5. openlayers3 实现测距 面积

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  6. Linux内核线程的思考与总结

    1.内核线程,只是一个称呼,实际上就是一个进程,有自己独立的TCB,参与内核调度,也参与内核抢占. 这个进程的特别之处有两点,第一.该进程没有前台.第二.永远在内核态中运行. 2.创建内核线程有两种方 ...

  7. Python 利用Python操作excel表格之openyxl介绍Part1

    利用Python操作excel表格之openyxl介绍 by:授客 QQ:1033553122 欢迎加入全国软件测试交流qq群(群号:7156436),免费获取以下性能监控工具(类似Nmon精简版) ...

  8. python协程--asyncio模块(基础并发测试)

    在高并发的场景下,python提供了一个多线程的模块threading,但似乎这个模块并不近人如意,原因在于cpython本身的全局解析锁(GIL)问题,在一段时间片内实际上的执行是单线程的.同时还存 ...

  9. Flutter 布局控件完结篇

    本文对Flutter的29种布局控件进行了总结分类,讲解一些布局上的优化策略,以及面对具体的布局时,如何去选择控件. 1. 系列文章 Flutter 布局详解 Flutter 布局(一)- Conta ...

  10. android默认开启adb调试方法分析

    用adb调试android时,每次接入usb线,都会提示一个确认打开usb调试功能的窗口,有时候,我们需要默认打开usb调试功能.或者无需弹出对话框,直接默认开启.这个我们需要分析adb的流程了. a ...