消息队列的概念、原理和场景详解

分类: 互联网 > 其他

主要内容:

  1. 消息队列的概念、原理和场景

  2. 解耦案例:队列处理订单系统和配送系统

  3. 流量削峰案例:Redis的List类型实现秒杀

  4. RabbitMQ:更专业的消息系统实现方案

 

一、PHP消息队列实现及应用:

  1. 消息队列概念:

    1. 队列结构的中间件

    2. 消息放入后,不需要立即处理

    3. 由订阅者/消费者按顺序处理

  2. 核心结构:

    1. 业务系统 ---入队 ---> 消息队列 ---出队---> 队列处理系统

  3. 应用场景:

    1. 冗余【数据需要冗余处理的时候】

    2. 解耦【解决了两套以上系统深度耦合的关系】

    3. 流量削峰

    4. 异步通信

    5. 扩展性

    6. 排序保证

  4. 队列介质:

    1. Mysql:可靠性高,易实现,速度慢

    2. Redis:速度快,单条大消息包时效率低

    3. 消息系统:专业性强,可靠,学习成本高【RabbitMQ】

  5. 消息处理触发机制:

    1. 死循环方式读取:易实现,故障时无法及时恢复

    2. 定时任务,压力均分,有处理量上限【推荐】

    3. 守护进程,类似于PHP-FPM和PHP-CG,需要shell基础

 

解耦案例:队列处理订单系统和配送系统

  1. 架构设计:

 

 

三、流量削峰案例:Redis的List类型实现秒杀

  1. Redis数据类型中的list类型

    1. LPUSH/LPUSHX:将值插入到(存在的)列表头部

    2. RPUSH/RPUSHX:将值插入到(存在的)列表尾部

    3. LPOP:移出并获取列表中的第一个元素

    4. RPOP:移出并获取列表中的最后一个元素

    5. LTRIM:保留指定区间内的元素

    6. LLEN:获取列表长度

    7. LSET:通过索引设置列表中元素的值

    8. LINDEX:通过索引获取列表汇总的元素

    9. LRANGE:获取列表中区间内的元素

  2. 代码级设计:

    1. 秒杀程序把请求写入Redis。

    2. 检查Redis已存放数据的长度,超出上限直接丢弃

    3. 死循环处理存入Redis的数据并入库

 

四、RabbitMQ:更专业的消息系统实现方案

  1. 特点:完整的实现了AMQP、集群简化,持久化,跨平台

  2. RabbitMQ使用:

    1. RabbitMQ安装(rabbitmq-server、php-amqplib)

    2. 生产者向消息通道发送消息

    3. 消费者处理消息

来源:原创 发布时间:2021-02-16 20:26:25