引言:订单状态机

订单状态必须按照固定流程流转:

待支付 → 已支付 → 已发货 → 已完成

使用顺序消息保证状态流转的正确性。

实现代码

// Producer:发送订单状态变更消息
public class OrderStatusProducer {
    public void changeStatus(Long orderId, String newStatus) {
        Message msg = new Message("order_status_topic",
            newStatus.getBytes());
        
        // 使用orderId作为orderKey,保证同一订单消息有序
        producer.send(msg, (mqs, msg1, arg) -> {
            int index = (int) (orderId % mqs.size());
            return mqs.get(index);
        }, orderId);
    }
}

// Consumer:顺序处理状态变更
@RocketMQMessageListener(
    topic = "order_status_topic",
    consumerGroup = "order_status_group",
    consumeMode = ConsumeMode.ORDERLY  // 顺序消费
)
public class OrderStatusConsumer implements RocketMQListener<String> {
    
    @Override
    public void onMessage(String newStatus) {
        // 验证状态流转合法性
        if (isValidTransition(currentStatus, newStatus)) {
            updateOrderStatus(orderId, newStatus);
        } else {
            log.error("非法状态流转");
        }
    }
}

核心要点

  1. orderKey选择:使用orderId保证同一订单有序
  2. 状态验证:Consumer端验证状态流转合法性
  3. 异常处理:非法状态流转记录日志并告警

本文关键词顺序消息实战 订单状态 状态机 有序流转