第一部分:MQ基础与技术选型(基础篇)

2026-04-04
4
-
- 分钟
|

一、 同步调用与异步通信的对比

课程中通过生动的例子引入了这两个概念:同步调用就像打视频电话,必须实时连通和响应;而异步通信就像发微信,发送方发完消息即可去处理其他事情,无需等待对方立刻回复,具有极强的并发处理能力。

在微服务开发中(以黑马商城的支付业务为例),传统基于 OpenFeign 的服务调用就是同步模式。例如,用户支付成功后,支付服务需要依次调用“扣减余额”、“更新支付状态”、“更新订单状态”等服务。同步调用虽然能立刻得到响应结果(适用于下一步操作强依赖上一步结果的场景,如必须扣减余额成功才能继续),但存在以下三大致命缺点:

  1. 代码耦合度高(扩展性差): 如果产品经理后续增加新需求(如支付成功后发送短信通知、增加用户积分等),开发人员就必须去修改核心的支付业务代码,违背了“开闭原则”(对扩展开放,对修改关闭)。

  2. 性能下降(响应时间长): 同步调用是阻塞式的,调用链路越长,等待时间越久。每个微服务的执行耗时会累加,例如每个操作耗时50毫秒,累加起来可能高达数百毫秒,导致CPU和线程资源被长期占用,系统并发能力极低,用户体验差。

  3. 级联失败: 如果调用链路上的某一个下游服务(如交易订单服务)出现故障,会导致整个链路抛出异常,甚至拖垮上游服务,引发雪崩效应。

解决方案:引入 MQ 进行异步通信 为了解决同步调用的问题,可以引入 MQ(MessageQueue,消息队列) 作为中间件(Broker)。支付服务完成核心操作后,只需将“支付成功”的消息发送到 MQ 中即可结束工作,耗时极短。其他后续服务(如通知服务、积分服务)只需监听 MQ 并在收到消息后各自并行处理。这样不仅实现了服务间的彻底解耦,还极大地提升了系统的响应速度和并发能力


二、 主流 MQ 技术选型比较

MQ(MessageQueue)本质上是一种先进先出(FIFO)的存取消息的容器。市面上有多种 MQ 的实现方案,课程主要对比了以下四种主流技术:

1. RabbitMQ

  • 开发语言与特性: 基于 Erlang 语言开发。Erlang 是一种面向并发的语言,原生具备极强的并发处理能力。

  • 性能: 吞吐量在万级到十万级,其最大优势是延迟最低(微秒级),近乎实时。

  • 优势: 社区非常活跃,官方维护更新快,可靠性高。

  • 适用场景: 大多数中小型企业的 QPS(每秒查询率)在几百到几万之间,RabbitMQ 的性能已经完全足够,且延迟极低,是目前国内中小型企业最主流的选择(也是本课程选用的技术)。

2. Kafka

  • 开发语言与特性: 基于 Scala 和 Java 开发,由 Apache 维护。

  • 性能: 吞吐量极其恐怖,可以达到每秒百万级别。延迟为毫秒级。

  • 缺点: 相比于 RabbitMQ 和 RocketMQ,它的消息可靠性相对较差,在极端情况下可能存在消息丢失的风险。

  • 适用场景: 专为海量数据设计,常用于大型项目中的海量日志收集与传输(每天产生几十G日志的场景)或大数据处理。

3. RocketMQ

  • 开发语言与特性: 由阿里巴巴开源,基于 Java 开发。

  • 性能: 吞吐量很高,达到每秒十万级别(十几到二十万)。延迟为毫秒级。

  • 优势: 各项指标非常均衡,消息可靠性极高(底层有完善的确认机制和内置消息表保底)。

  • 适用场景: 适用于大型互联网公司、金融业务,或者大量使用阿里系开源组件的企业。缺点是阿里开源产品的后续社区维护活跃度可能不如专门做 MQ 的公司。

4. ActiveMQ

  • 开发语言与特性: Apache 出品,基于 Java 开发。

  • 劣势: 虽然支持非常丰富的协议,但不论是可用性、吞吐量(最低)还是可靠性,相比于前三者都较差,目前在企业中已逐渐被淘汰。

总结选型建议: 如果是大数据海量日志场景,无脑选 Kafka;如果是基础业务,对延迟要求极高且团队规模中等,RabbitMQ 是首选;如果业务并发量极高、对消息绝对可靠性有严苛要求(如金融交易),可以选择 RocketMQ

评论交流

文章目录