引言:延迟消息的应用场景

典型场景:

  • 订单超时自动取消(30分钟未支付)
  • 定时推送消息(生日祝福)
  • 延迟重试(失败后延迟重试)

延迟级别

RocketMQ支持18个延迟级别:

1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h

##实现原理

// 发送延迟消息
Message msg = new Message("topic", "body".getBytes());
msg.setDelayTimeLevel(3);  // 延迟10秒
producer.send(msg);

// 原理:
// 1. 消息先发送到SCHEDULE_TOPIC_XXXX
// 2. 定时任务扫描到期消息
// 3. 投递到目标Topic

实战案例

// 订单超时取消
public void createOrder(Order order) {
    // 1. 创建订单
    orderService.save(order);
    
    // 2. 发送延迟消息(30分钟)
    Message msg = new Message("order_timeout_topic",
        order.getId().toString().getBytes());
    msg.setDelayTimeLevel(16);  // 30分钟
    producer.send(msg);
}

// Consumer处理超时订单
@Override
public void onMessage(String orderId) {
    Order order = orderService.getById(orderId);
    if ("CREATED".equals(order.getStatus())) {
        // 仍未支付,取消订单
        orderService.cancel(orderId);
    }
}

本文关键词延迟消息 定时任务 订单超时 延迟队列