核心定位
消息队列是子系统间异步通信的「中枢神经」。当 ERP 出库需要通知 WMS 更新库存、当商城支付成功需要给会员发放积分——这些跨模块的异步协作都通过消息队列完成。
设计哲学:业务代码只依赖
yudao-spring-boot-starter-mq抽象接口,切换底层实现只需改一行配置。
适合什么样的用户
| 用户画像 | 推荐方案 |
|---|---|
| 开发调试阶段 | Spring Event(默认,零依赖) |
| 中小型项目 | Redis Stream(持久化,支持消费者组) |
| 企业级项目 | RabbitMQ(稳定可靠,运维成熟) |
| 高吞吐场景 | RocketMQ(阿里系,分布式事务) |
| 大数据场景 | Kafka(日志、埋点、数据管道) |
架构设计
graph TB
subgraph 业务层["业务代码层(只依赖抽象)"]
P["生产者
MessageProducer.send()"] C["消费者
MessageConsumer.onMessage()"] end subgraph 抽象层["抽象层 yudao-spring-boot-starter-mq"] API["统一 API
Message / MessageProducer / MessageConsumer"] end subgraph 实现层["实现层(五选一)"] SE["yudao-spring-boot-starter-mq-spring-event
Spring Event(默认)"] REDIS["yudao-spring-boot-starter-mq-redis
Redis Stream"] RABBIT["yudao-spring-boot-starter-mq-rabbitmq
RabbitMQ"] ROCKET["yudao-spring-boot-starter-mq-rocketmq
RocketMQ"] KAFKA["yudao-spring-boot-starter-mq-kafka
Kafka"] end P --> API C --> API API --> SE API --> REDIS API --> RABBIT API --> ROCKET API --> KAFKA
MessageProducer.send()"] C["消费者
MessageConsumer.onMessage()"] end subgraph 抽象层["抽象层 yudao-spring-boot-starter-mq"] API["统一 API
Message / MessageProducer / MessageConsumer"] end subgraph 实现层["实现层(五选一)"] SE["yudao-spring-boot-starter-mq-spring-event
Spring Event(默认)"] REDIS["yudao-spring-boot-starter-mq-redis
Redis Stream"] RABBIT["yudao-spring-boot-starter-mq-rabbitmq
RabbitMQ"] ROCKET["yudao-spring-boot-starter-mq-rocketmq
RocketMQ"] KAFKA["yudao-spring-boot-starter-mq-kafka
Kafka"] end P --> API C --> API API --> SE API --> REDIS API --> RABBIT API --> ROCKET API --> KAFKA
五种实现对比
| 实现 | 持久化 | 消费模式 | 适用场景 | 切换配置 |
|---|---|---|---|---|
| Spring Event | ❌ 内存级 | 广播 | 开发调试 | 默认 |
| Redis Stream | ✅ | 集群消费/广播 | 中小型项目 | yudao.mq.type=redis |
| RabbitMQ | ✅ | 多种模式 | 企业级项目 | yudao.mq.type=rabbitmq |
| RocketMQ | ✅ | 集群/广播/顺序 | 高吞吐、事务消息 | yudao.mq.type=rocketmq |
| Kafka | ✅ | 分区消费 | 大数据、日志 | yudao.mq.type=kafka |
使用示例
定义消息
// 1. 定义消息类,实现 Message 接口
@Data
public class OrderPaidMessage implements Message {
private Long orderId;
private Long userId;
private Integer amount;
}
发送消息
@Resource
private MessageProducer messageProducer;
public void payOrder(Long orderId) {
// 业务处理...
// 发送消息
OrderPaidMessage message = new OrderPaidMessage();
message.setOrderId(orderId);
message.setUserId(getCurrentUserId());
message.setAmount(order.getAmount());
messageProducer.send(message);
}
消费消息
@Component
public class OrderPaidConsumer implements MessageConsumer<OrderPaidMessage> {
@Override
public void onMessage(OrderPaidMessage message) {
// 发放积分
memberService.addPoints(message.getUserId(), message.getAmount());
// 更新库存
stockService.decreaseStock(message.getOrderId());
}
}
子系统间的典型消息流
sequenceDiagram
participant MALL as 商城模块
participant MQ as 消息队列
participant WMS as 仓库模块
participant MEMBER as 会员模块
MALL->>MALL: 用户支付成功
MALL->>MQ: 发送「订单已支付」消息
MQ->>WMS: 消费消息 → 扣减库存
MQ->>MEMBER: 消费消息 → 发放积分
Note over WMS,MEMBER: 两个消费者独立执行,互不影响
切换方式
只需修改配置文件:
# 从 Spring Event 切换到 Redis Stream
yudao:
mq:
type: redis # 改成 redis / rabbitmq / rocketmq / kafka
无需修改任何业务代码。