网站开发与建设个人总结,龙岩融胤网络科技有限公司,西乡网站开发,永久在线观看电影网址30分钟课程#xff1a;订单超时关闭实战#xff08;Kafka延时队列 定时任务补偿#xff09; 课程目标
理解订单超时关闭的业务场景与核心需求。掌握基于 Kafka 延时队列与定时任务的关单方案设计。实现高并发场景下的可靠关单逻辑#xff08;防重复、幂等性#xff09;。…
30分钟课程订单超时关闭实战Kafka延时队列 定时任务补偿 课程目标
理解订单超时关闭的业务场景与核心需求。掌握基于 Kafka 延时队列与定时任务的关单方案设计。实现高并发场景下的可靠关单逻辑防重复、幂等性。 课程内容与时间分配 0~5分钟课程概述
业务场景与挑战
超时关单用户下单后未支付需在指定时间如30分钟后自动关闭订单并释放库存。核心问题 精准延迟如何确保消息在指定时间后被消费可靠性避免消息丢失或重复消费导致订单状态错误。高性能支撑每日百万级订单的关单需求。
技术选型
Kafka 延时队列利用 Kafka 时间轮Timer Wheel实现近似延迟需外部存储辅助。定时任务补偿兜底扫描未支付订单防止 Kafka 消息丢失或延迟误差。 5~10分钟技术难点与核心问题
Kafka 原生不支持延时队列 需结合业务逻辑实现消息延迟投递如按时间分桶。 消息重复消费 网络抖动或消费者重启可能导致重复关单。 分布式系统时钟同步 多节点定时任务需避免重复扫描分布式锁。 数据一致性 关单需同时释放预扣库存、更新订单状态需事务性保障。 10~25分钟解决方案与代码实战 1. Kafka延时队列设计10~15分钟
方案设计
消息分桶按延迟时间分多个 Topic如 delay_5m、delay_30m。生产者逻辑订单创建时发送消息到对应延迟 Topic。消费者逻辑监听延迟 Topic到期后触发关单。
生产者代码发送延迟消息
Service
public class OrderTimeoutProducer { Autowired private KafkaTemplateString, String kafkaTemplate; // 发送延迟消息按分钟分桶 public void sendDelayMessage(String orderId, long delayMinutes) { String topic delay_ delayMinutes m; kafkaTemplate.send(topic, orderId); }
} // 订单创建时调用延迟30分钟
orderTimeoutProducer.sendDelayMessage(orderId, 30); 消费者代码处理关单
KafkaListener(topics delay_30m)
public void handleDelayMessage(String orderId) { Order order orderService.getOrder(orderId); if (order.getStatus() OrderStatus.UNPAID) { orderService.closeOrder(orderId); // 关单逻辑释放库存、更新状态 }
} 2. 定时任务补偿15~25分钟
方案设计
兜底扫描每小时扫描一次未支付且未关闭的订单创建时间 30分钟。分布式锁防止多节点重复扫描Redis 锁。
定时任务代码
Scheduled(cron 0 0/60 * * * ?) // 每小时执行一次
public void scanUnpaidOrders() { String lockKey lock:scan_unpaid_orders; // 获取分布式锁Redis 实现 if (redisLock.tryLock(lockKey, 60)) { try { // 查询超过30分钟未支付的订单 ListOrder orders orderMapper.selectUnpaidOrders(30); for (Order order : orders) { orderService.closeOrder(order.getOrderId()); } } finally { redisLock.unlock(lockKey); } }
} 关单幂等性处理
public void closeOrder(String orderId) { // 使用数据库乐观锁确保幂等性 int rows orderMapper.updateOrderStatus( orderId, OrderStatus.UNPAID, OrderStatus.CLOSED ); if (rows 0) { stockService.rollbackStock(orderId); // 释放库存 }
} 25~30分钟练习与拓展 练习题目
动态延迟配置 要求支持不同商品类目设置不同的关单时间如虚拟商品5分钟实物商品30分钟。 消息丢失补偿 场景Kafka 消息丢失导致未触发关单。任务优化定时任务扫描逻辑优先处理 Kafka 未覆盖的订单。
推荐拓展方向
精准延时队列 结合 RocketMQ 的延迟消息支持18个固定延迟级别。 分库分表优化 按订单创建时间分表提升定时任务扫描效率。 重试队列设计 关单失败时将订单ID投递到重试队列最多重试3次。 课程总结
延时队列核心逻辑Kafka 分桶 定时任务兜底平衡性能与可靠性。关键设计 幂等性通过数据库乐观锁防止重复关单。分布式锁避免定时任务多节点重复执行。事务性关单与库存释放需原子化可结合本地事务表。 适用场景高并发、允许短暂误差的延迟任务如订单关单、优惠券过期。
课后资源
Kafka 延时队列参考Kafka Delayed Message Design完整代码示例GitHub - 电商关单系统Demo