核心定位
訊息佇列是子系統間非同步通訊的「中樞神經」。當 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
無需修改任何業務程式碼。