消息队列应用场景
消息队列为什么存在?消息队列是什么?
1. 消息队列的概念?
重要
消息队列(Message Queue,MQ)是一种跨进程的通信机制,用于分布式系统存储 、传递和处理消息
- 它本质上是一个先进先出(FIFO)的数据结构,位于生产者(Producer)和消费者(Consumer)之间,允许二者以异步、送耦合的方式进行交换数据。
核心组成
生产者(Producer):发送消息到队列的一方。
消息(Message):传递的数据单元,通常包含业务信息(如用户ID、事件类型等)。
队列(Queue):临时存储消息的缓冲区,确保消息不丢失。
消费者(Consumer):从队列中取出并处理消息的一方。
Broker(可选):消息中间件服务器(如 RabbitMQ、Kafka),负责消息的路由、持久化、投递等。基本工作流程
系统A(生产者) → 发送消息 → 消息队列 → 消息被暂存 →
系统B(消费者) → 拉取/接收 → 处理消息关键
- 异步通信: 生产者无需等待消费者处理完成
- 持久化: 消息可落盘,防止服务重启丢失
- 可靠投递: 支持ACK机制,确保消息至少被消费一次
- 顺序性 /幂等性(消息队列中间件): 满足特定业务需求
“中间件”在这里 = 消息队列的具体实现产品(如 Kafka、RabbitMQ 等)
消息队列的异步
消息队列的异步和平时提到的异步 是不一样的,见文章 PHP 中三种异步模式对比:FPM 同步、Swoole 协程与消息队列
2.为什么需要消息队列?
重要
消息队列的本质,在生产者和消费者之间引入一个缓冲层
(1)解耦
- 问题:
场景:
系统A使用系统B,传统方式之间在A里通过模拟请求系统B接口,编写系统B参数进行处理。
缺点:
系统B因为业务需求修改接口参数(或者是因为故障),对应的系统A也得进行相应的修改- 方案:
消息队列:
系统B将消息发送到队列,系统A异步消费。双方只依赖队列,互不干扰优点
系统独立、故障隔离、降低维护成本
(2)异步处理
- 问题:
场景:
用户注册后需要发送邮件、短信、更新日志信息等
缺点:
同步执行导致响应慢,高负载下容易成为性能瓶颈- 方案:
主流程仅完成核心操作(写库),其余任务入队列异步处理优点
提升响应速度(秒级返回)、提高系统吞吐
(3)流量削峰
- 问题:
场景:
在订单激增的情况下,QPS从100涨到10000,数据库直接崩溃
QPS:
系统在一秒钟内能够成功处理的请求(或查询)数量
并发:
系统中同时正在处理的请求数量- 方案:
请求先入队列缓冲,消费者按能力均速处理优点
避免雪崩,平滑应对突发流量
(4)广播与多消费者(Pub/Sub)
- 问题:
场景:
一个事件需要被多给系统感知(用户注册,需要通知其他系统,做对应的初始化)- 方案:
发布\订阅模式,一条消息被多个消费者组独立消费优点
天然支持扩展新监听者,避免重复调用
redis队列、kafka ,见下一篇,redis 队列、kafka、RabbitMQ
版权所有
版权归属:念宇
