初识 MQ:从同步到异步,聊聊消息队列那些事
初识 MQ(消息队列):从同步到异步,聊聊消息队列那些事
一、同步调用:简单但耦合
1.1 什么是同步调用?
同步调用意味着 调用方需要等待被调用方返回结果,才能继续往下执行。
例如:
用户下单 → 调用库存服务扣库存 → 调用支付服务支付 → 返回下单结果
整个流程是串行的,只要其中一个环节卡住(如库存服务响应慢),整个调用链都会被阻塞。
1.2 同步调用的弊端
✅ 简单易实现,易于调试。
✅ 时效性强,等待到结果后才返回
❌ 耦合度高,服务之间强依赖。
❌ 容错能力差,某个服务挂了可能会影响整条链路。
❌ 性能瓶颈明显,不适合高并发场景。
❌ 拓展性差
❌ 性能下降
❌ 级联失败
二、异步调用:解耦、提速、削峰
2.1 什么是异步调用?
异步调用通过消息队列来实现,调用方 发送消息到队列 后就可以立刻返回,由消费者服务 异步处理消息。
三个角色:
- 消息发送者:投递消息的人,就是原来的调用方
- 消息Broker:管理、暂存、转发消息
- 消息接收者:接收和处理消息的人,就是原来的服务提供方
2.2 异步调用的优势
✅ 解耦合,拓展性好:服务之间不再直接调用,互不影响。
✅ 高性能:,无需等待响应速度快,吞吐量大。
✅ 容错性强:消费者服务可独立处理失败重试。
✅ 支持广播、延迟、定时等高级功能。
✅ 故障隔离
✅ 缓存消息,流量削峰填谷
2.3 异步调用的挑战
❌ 实现复杂度高。
❌ 消息可靠性(丢失、重复)需特别处理。
❌ 引入额外组件(如 MQ 中间件)增加运维成本。
三、技术选型:主流 MQ 对比
名称 | 开发语言 | 公司 | 协议支持 | 特点描述 | 适用场景 |
---|---|---|---|---|---|
RabbitMQ | Erlang(面向并发) | Rabbit | AMQP,XMPP,SMTP,STOMP | 轻量级、易上手、插件丰富、AMQP协议 | 小中型项目、快速开发 |
RocketMQ | Java | 阿里 | 自定义协议 | 高性能、支持顺序消息、事务消息、轻量分布式部署 | 金融、电商等高并发场景 |
Kafka | Scala&Java | Apache | 自定义协议 | 高吞吐、分布式日志系统、偏向于数据流处理 | 大数据处理、日志系统 |
ActiveMQ | Java | Apache | OpenWire,STOMP,REST,XMPP,AMQP | 较老牌,功能全,但性能不如其他新一代 MQ | 老项目、轻量应用 |
- 追求可用性:Kafka、 RocketMQ 、RabbitMQ
- 追求可靠性:RabbitMQ、RocketMQ
- 追求吞吐能力:RocketMQ、Kafka
- 追求消息低延迟:RabbitMQ、Kafka