博客
关于我
PHP消息队列的实现方式与详解,值得一看
阅读量:794 次
发布时间:2023-03-01

本文共 875 字,大约阅读时间需要 2 分钟。

队列原理:

队列是一种非常有趣的数据结构,它遵循 FIFO(先进先出)的规则。业务系统和队列处理系统之间没有直接的联系。写入队列的系统只负责将数据推送到队列中,不需要关心队列中的数据是否被读取或处理。读取队列的系统同样只负责从队列中获取数据进行处理,两者的工作是完全解耦的。

应用场景:

  • 冗余:通过持久化存储实现数据的冗余,后续由订单处理程序获取并处理完成后删除原数据记录。
  • 解耦:将业务系统和队列处理系统分开,避免单点故障。例如,订单系统和物流系统可以通过队列进行解耦,保证两者之间的松散耦合。
  • 流量削锋:在秒杀和抢购场景中,使用消息队列限制并存储请求,确保系统在高并发情况下的稳定性。
  • 异步通信:通过消息队列实现系统间的异步操作,减少 Blocking 操作,提升系统性能和响应速度。
  • 扩展性:在有多个系统需要处理相同类型数据时,所有系统都可以订阅同一个队列,实现动态扩展。
  • 消息处理触发机制:

  • 死循环方式:适用于短时间内需要处理大量消息的场景,例如秒杀活动。
  • 定时任务:通过定时任务分配处理任务,避免在高并发情况下系统过载。例如,订单系统将订单写入队列后立即返回成功,配货系统则每隔几分钟定时读取队列并处理订单。
  • 守护进程:使用守护进程监控队列状态,定期检查队列中是否有待处理的消息。例如,在 PHP 中可以使用 PHP-FPM 和 CGI 脚本实现。
  • 使用 MySQL 实现解耦案例:

    为什么要解耦?
    如果订单系统和物流系统耦合在一起,订单系统一旦崩溃,物流系统也会受到影响。通过解耦,可以让订单系统专注于接收和处理订单,物流系统专注于处理物流信息,从而提升系统的稳定性和可靠性。

    表的设计:

    订单系统写入队列的代码:
    配货系统读取队列的代码:
    执行定时任务:
    如何使用 Crontab 告诉系统定时执行任务?

    注意:

    这日志文件需要自己新建。

    使用 Redis 进行流量削锋案例:

    思路:

  • 秒杀程序将请求写入 Redis。
  • 检查 Redis 中已存放的数据长度,如果超过上限直接返回秒杀结束。
  • 使用死循环处理存入 Redis 的数据并入库。
  • 转载地址:http://fxtfk.baihongyu.com/

    你可能感兴趣的文章
    PHP获取当前文件的绝对路径
    查看>>
    PHP获取当前时间、时间戳的各种格式写法汇总
    查看>>
    PHP获取当前页面的完整URL
    查看>>
    php获取数据库中数据生成json,中文乱码问题的解决方案
    查看>>
    php获取文件夹中文件的两种方法
    查看>>
    PHP获取日期的一些方法总结
    查看>>
    R2学习记录
    查看>>
    PHP获取本周的每一天的时间
    查看>>
    php获取用户真实IP和防刷机制
    查看>>
    php获取网页内容的三种方法
    查看>>
    R-CNN算法优化策略
    查看>>
    PHP规范PSR0和PSR4的理解
    查看>>
    php解析ipa包,获取logo
    查看>>
    R&Rstudio安装各种包
    查看>>
    php设置cookie,在js中如何获取
    查看>>
    php设置socket超时时间
    查看>>
    php设计模式 萨莱 pdf,PHP设计模式 建造者模式
    查看>>
    PHP设计模式之----观察者模式
    查看>>
    php设计模式之装饰器模式
    查看>>
    R&Python Data Science系列:数据处理(5)--字符串函数基于R(一)
    查看>>