中间件概述
2020/6/8约 1119 字
一、什么是消息中间件
消息中间件(Message Queue, MQ)没有统一的标准定义。一般认为,它是分布式系统中的一个子系统,专注于数据的发送和接收,通过高效可靠的异步消息传递机制,将分布式系统中的各个子系统集成在一起。
简单来说,消息中间件不生产消息,只是消息的搬运工。
二、为什么要使用消息中间件
以电商交易为例,用户下单后,系统需要:
- 调用库存系统扣减库存。
- 调用物流系统安排发货。
如果交易、库存、物流都属于同一个系统,可以直接使用接口调用。但随着业务发展,系统模块变得庞大且复杂,必须进行服务化拆分,这时需要考虑如何让这些系统协同工作。
常见的交互方式:
- RPC(Remote Procedure Call):如 Dubbo、SpringCloud,适用于强依赖场景。
- 消息中间件:适用于异步解耦、削峰填谷等场景。
消息中间件的优势
- 低耦合:系统之间通过消息中间件通信,避免直接依赖。
- 异步处理:子系统可以独立执行逻辑,无需等待。
- 流量削峰:缓解流量高峰,如秒杀业务。
消息中间件与 RPC 的区别
- 依赖性:
- 例如短信通知服务并非交易流程的必需环节,不应影响下单。
- 如果使用 RPC,短信服务宕机会导致整个业务受影响。
- 通过消息中间件解耦后,短信服务宕机不会影响主流程。
- 同步性:
- RPC 是同步调用,需要等待远程接口返回。
- 消息中间件是异步处理,不阻塞主流程。
三、消息中间件的使用场景
1. 异步处理
场景:用户注册后,需要发送邮件和短信通知。
- 传统方式:注册成功后直接调用邮件和短信服务,导致接口响应变慢。
- 使用消息中间件:注册成功后,消息进入队列,由邮件和短信服务消费,提高响应速度。
2. 应用解耦
场景:用户注册后,需要触发多个后续操作(如邮件、短信、日志记录)。
- 传统方式:直接调用多个接口,某个服务宕机会影响注册流程。
- 使用消息中间件:注册服务只需发布消息,各个子系统各自消费,互不影响。
3. 流量削峰
场景:秒杀活动会导致短时间内流量暴增,可能压垮系统。
- 在前端引入消息队列,控制请求进入速率,防止系统崩溃。
4. 重要操作的日志处理
场景:某些关键操作(订单变更、用户行为)需要记录日志。
- 业务系统将日志写入 MQ,由日志系统异步消费,避免影响主业务。
5. 消息通讯
场景:点对点消息传递、聊天室等。
- 点对点通讯:客户端 A 和 B 通过 MQ 传递消息。
- 聊天室通讯:多个客户端订阅同一主题,实现群聊。
四、如何选择消息中间件
主流消息中间件对比(数据来源于网络):
比较项 | RabbitMQ | RocketMQ | Kafka |
---|---|---|---|
性能(单台) | 万级(12000+) | 十万级 | 百万计 |
消息持久化 | 支持 | 支持 | 支持 |
多语言支持 | 支持 | 很少 | 支持 |
社区活跃度 | 高 | 中 | 高 |
支持协议 | 多(AMQP、STOMP、MQTT...) | 自定义协议 | 自定义协议 |
综合评价 | 优点:性能较好,管理界面较丰富,在互联网公司也有较大规模的应用,有多个语言的成熟客户端 缺点:内部机制较难理解,集群不支持动态扩展 | 优点:模型简单,接口易用,在阿里有大规模应用,分布式系统,性能很好,版本更新快 缺点:文档少,支持的语言较少 | 优点:天生分布式,性能最好,常见于大数据领域 缺点:运维难度大,偶尔有数据混乱,对 ZooKeeper 依赖较强,多副本机制对带宽有一定要求 |
不过目前来说,橘子接触的公司或者客户公司使用的比较多的还是 RocketMQ 和 Kafka,RabbitMQ 使用的比较少的,所以橘子会对 RocketMQ 和 Kafka 详细介绍。
贡献者
juzicoding