核心定位

訊息佇列是子系統間非同步通訊的「中樞神經」。當 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