在交易系統裡,一筆訂單成立的關鍵步驟是 Wallet 的資產核定。
這裡我選擇使用 事件驅動 的方式完成核定,而不是讓 Order Service 直接呼叫 Wallet API。這個決策來自兩個考量:
@Component
public class OrderStatusTracker {
private final Map<UUID, OrderStatus> statusMap = new ConcurrentHashMap<>();
public void markPending(UUID orderId) {
statusMap.put(orderId, OrderStatus.PENDING);
}
@RabbitListener(queues = ORDER_CREATED_QUEUE)
public void onOrderCreated(OrderCreatedEvent event) {
statusMap.put(event.getOrderId(), OrderStatus.CREATED);
}
@RabbitListener(queues = ORDER_MATCHED_QUEUE)
public void onOrderMatched(OrderMatchedEvent event) {
statusMap.put(event.getOrderId(), OrderStatus.MATCHED);
}
public OrderStatus getStatus(UUID orderId) {
return statusMap.get(orderId);
}
}
這樣,前端如果要查詢訂單狀態,只要呼叫 Order Service 的查詢 API,就能直接讀取這個 Map,不需要即時查 Wallet 或 MatchEngine。