初识 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