消息队列

核心定位

消息队列是子系统间异步通信的「中枢神经」。当 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

五种实现对比

实现 持久化 消费模式 适用场景 切换配置
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

无需修改任何业务代码。

docs