第1章 什么是消息队列
1.什么是消息队列MQ
MQ(message queue)翻译过来就是消息队列,队列的特点是先入先出,如同我们前面学过的ELK中使用Redis作为缓存一样,有了消息队列之后应用之间就不用强依赖,大家就可以把需要处理的消息存到消息队列里,然后有需要服务就从消息队列里取出并处理即可,这样也叫解耦。好处是异步处理缩短时间,如果某一个服务故障了也不影响其他的服务。
2.为什么需要使用MQ
2.1 流量削峰/流量抗压
2.2 异步处理
2.3 应用解耦
3.常见消息队列软件分类
特性 | ActiveMQ | RabbitMQ | Kafka | RocketMQ |
---|---|---|---|---|
所属社区/公司 | Apache | Mozilla Public License | Apache | Apache/Alibaba |
成熟度 | 成熟 | 成熟 | 成熟 | 比较成熟 |
生产者-消费者模式 | 支持 | 支持 | 支持 | 支持 |
发布-订阅 | 支持 | 支持 | 支持 | 支持 |
REQUEST-REPLY | 支持 | 支持 | - | 支持 |
API完备性 | 高 | 高 | 高 | 低(静态配置) |
多语言支持 | 支持JAVA优先 | 语言无关 | 支持,JAVA优先 | 支持 |
单机呑吐量 | 万级(最差) | 万级 | 十万级 | 十万级(最高) |
消息延迟 | - | 微秒级 | 毫秒级 | - |
可用性 | 高(主从) | 高(主从) | 非常高(分布式) | 高 |
消息丢失 | - | 低 | 理论上不会丢失 | - |
消息重复 | - | 可控制 | 理论上会有重复 | - |
事务 | 支持 | 不支持 | 支持 | 支持 |
4.kafka应用场景
Kafka 作为高吞吐、高可靠、分布式的消息队列(MQ),在以下场景中常用于系统解耦、异步通信、流量削峰等典型消息队列需求,以下是具体场景说明:
1. 医疗
• 医疗设备数据异步采集 多台医疗设备(如心电图仪、血糖仪)实时生成数据,通过 Kafka 异步传输到后端分析系统,避免设备直接对接处理服务,解耦数据生产与消费。 • 跨系统数据同步 医院 HIS(医院信息系统)、LIS(检验系统)、PACS(影像系统)之间的数据变更(如患者信息更新)通过 Kafka 通知订阅方,确保系统间数据最终一致性。 • 预约挂号排队 高并发挂号请求写入 Kafka 队列,后端服务按处理能力消费,避免因瞬时流量激增导致系统崩溃。
2. 金融
• 支付交易削峰填谷 秒杀活动或节日促销期间,支付请求写入 Kafka 队列,后端按固定速率处理,防止支付网关过载。 • 跨机构交易异步通知 银行与第三方支付平台(如支付宝)的交易结果通知通过 Kafka 异步传递,确保通信可靠性,避免回调超时导致的交易状态不一致。 • 批量任务调度 日终报表生成、对账文件解析等耗时任务通过 Kafka 分发到不同计算节点,实现任务并行处理。
3. 电商
• 订单状态流转 订单创建后,通过 Kafka 通知库存系统扣减库存、支付系统发起扣款、物流系统生成运单,实现核心业务系统解耦。 • 促销消息推送 促销活动(如限时折扣)的配置信息通过 Kafka 广播到所有应用服务器,确保各节点缓存同步更新。 • 客服工单排队 用户提交的售后工单写入 Kafka 队列,客服系统按优先级(如 VIP 用户优先)消费处理。
4. 在线教育
• 课程更新通知 课程内容(如视频、课件)更新后,通过 Kafka 通知所有订阅用户(如学生 App 端),触发本地缓存刷新。 • 作业批改任务分发 学生提交的作业(如编程题、作文)写入 Kafka 队列,由 AI 批改服务或教师人工服务异步处理,避免阻塞提交接口。 • 直播课弹幕缓冲 高并发弹幕消息先写入 Kafka,按直播间分区消费,保证消息顺序性并缓解前端发送压力。
5. 无人机
• 飞行指令队列 地面控制中心发送的起飞、降落、返航指令写入 Kafka,无人机根据网络状态按顺序消费指令,避免指令丢失或乱序。 • 任务协同分发 无人机集群执行大面积测绘任务时,划分的测绘区域坐标通过 Kafka 分发到各无人机节点,实现任务均衡分配。 • 故障告警通知 无人机传感器检测到电池低电量或引擎异常时,告警信息通过 Kafka 实时通知监控平台,触发应急流程。
6. 直播
• 礼物打赏异步入账
用户打赏礼物的消息写入 Kafka,后端服务异步处理虚拟货币扣减和打赏记录入库,避免高并发导致支付系统阻塞。
• 弹幕消息分区存储
不同直播间的弹幕按 room_id
分区存储到 Kafka,消费者按需订阅指定分区,提升消息吞吐量和顺序性。
• 直播状态同步
主播开播/停播状态变更通过 Kafka 通知所有订阅服务(如推荐系统、计费系统),实现状态一致性。
7. 游戏
• 玩家行为日志收集 玩家登录、战斗、充值等事件通过 Kafka 异步上报到日志分析系统,避免日志写入阻塞核心游戏逻辑。 • 跨服消息传递 不同服务器玩家组队或跨服竞技时,角色数据通过 Kafka 在多个游戏节点间同步,解决跨服通信问题。 • 邮件系统异步通知 玩家奖励发放、活动提醒等系统邮件通过 Kafka 队列发送,支持批量处理,避免邮件服务成为性能瓶颈。
Kafka 作为消息队列的核心优势
- 流量削峰:缓冲突发流量,保护下游系统稳定性。
- 系统解耦:生产者与消费者无需感知彼此存在,通过 Topic 通信。
- 顺序性与分区:通过消息 Key 分区,保证同一业务(如订单 ID)的消息顺序消费。
- 高可靠:消息持久化存储,支持多副本机制,防止数据丢失。
- 水平扩展:通过增加分区和消费者,轻松应对业务增长。
与传统消息队列(如 RabbitMQ)的差异
• 适用场景:Kafka 更适合高吞吐、大数据量、持久化场景;RabbitMQ 适合低延迟、复杂路由需求。 • 设计差异:Kafka 基于分区和批量处理优化吞吐,RabbitMQ 基于队列和 ACK 机制保证消息可靠性。
以上场景均通过 Kafka 的 发布-订阅模型 和 分区队列机制 实现,帮助业务系统在分布式架构下实现松耦合、高可用的异步通信。
更新: 2025-04-07 10:22:02