当前位置: 首页 > news >正文

【JAVA架构师成长之路】【电商系统实战】第9集:订单超时关闭实战(Kafka延时队列 + 定时任务补偿)


30分钟课程:订单超时关闭实战(Kafka延时队列 + 定时任务补偿)


课程目标
  1. 理解订单超时关闭的业务场景与核心需求。
  2. 掌握基于 Kafka 延时队列与定时任务的关单方案设计。
  3. 实现高并发场景下的可靠关单逻辑(防重复、幂等性)。

课程内容与时间分配


0~5分钟:课程概述

业务场景与挑战

  • 超时关单:用户下单后未支付,需在指定时间(如30分钟)后自动关闭订单并释放库存。
  • 核心问题
    • 精准延迟:如何确保消息在指定时间后被消费?
    • 可靠性:避免消息丢失或重复消费导致订单状态错误。
    • 高性能:支撑每日百万级订单的关单需求。

技术选型

  • Kafka 延时队列:利用 Kafka 时间轮(Timer Wheel)实现近似延迟(需外部存储辅助)。
  • 定时任务补偿:兜底扫描未支付订单,防止 Kafka 消息丢失或延迟误差。

5~10分钟:技术难点与核心问题
  1. Kafka 原生不支持延时队列
    • 需结合业务逻辑实现消息延迟投递(如按时间分桶)。
  2. 消息重复消费
    • 网络抖动或消费者重启可能导致重复关单。
  3. 分布式系统时钟同步
    • 多节点定时任务需避免重复扫描(分布式锁)。
  4. 数据一致性
    • 关单需同时释放预扣库存、更新订单状态,需事务性保障。

10~25分钟:解决方案与代码实战

1. Kafka延时队列设计(10~15分钟)

方案设计

  • 消息分桶:按延迟时间分多个 Topic(如 delay_5m、delay_30m)。
  • 生产者逻辑:订单创建时发送消息到对应延迟 Topic。
  • 消费者逻辑:监听延迟 Topic,到期后触发关单。

生产者代码(发送延迟消息)

@Service  
public class OrderTimeoutProducer {  @Autowired  private KafkaTemplate<String, 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分钟未支付的订单  List<Order> 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分钟:练习与拓展

练习题目
  1. 动态延迟配置
    • 要求:支持不同商品类目设置不同的关单时间(如虚拟商品5分钟,实物商品30分钟)。
  2. 消息丢失补偿
    • 场景:Kafka 消息丢失导致未触发关单。
    • 任务:优化定时任务扫描逻辑,优先处理 Kafka 未覆盖的订单。
推荐拓展方向
  1. 精准延时队列
    • 结合 RocketMQ 的延迟消息(支持18个固定延迟级别)。
  2. 分库分表优化
    • 按订单创建时间分表,提升定时任务扫描效率。
  3. 重试队列设计
    • 关单失败时,将订单ID投递到重试队列,最多重试3次。

课程总结

  • 延时队列核心逻辑:Kafka 分桶 + 定时任务兜底,平衡性能与可靠性。
  • 关键设计
    1. 幂等性:通过数据库乐观锁防止重复关单。
    2. 分布式锁:避免定时任务多节点重复执行。
    3. 事务性:关单与库存释放需原子化(可结合本地事务表)。
  • 适用场景:高并发、允许短暂误差的延迟任务(如订单关单、优惠券过期)。

课后资源

  • Kafka 延时队列参考:Kafka Delayed Message Design
  • 完整代码示例:GitHub - 电商关单系统Demo

相关文章:

【JAVA架构师成长之路】【电商系统实战】第9集:订单超时关闭实战(Kafka延时队列 + 定时任务补偿)

30分钟课程&#xff1a;订单超时关闭实战&#xff08;Kafka延时队列 定时任务补偿&#xff09; 课程目标 理解订单超时关闭的业务场景与核心需求。掌握基于 Kafka 延时队列与定时任务的关单方案设计。实现高并发场景下的可靠关单逻辑&#xff08;防重复、幂等性&#xff09;。…...

《探秘课程蒸馏体系“三阶训练法”:解锁知识层级递进式迁移的密码》

在人工智能与教育科技深度融合的时代&#xff0c;如何高效地实现知识传递与能力提升&#xff0c;成为众多学者、教育工作者以及技术专家共同探索的课题。课程蒸馏体系中的“三阶训练法”&#xff0c;作为一种创新的知识迁移模式&#xff0c;正逐渐崭露头角&#xff0c;为解决这…...

K8s 1.27.1 实战系列(六)Pod

一、Pod介绍 1、Pod 的定义与核心设计 Pod 是 Kubernetes 的最小调度单元,由一个或多个容器组成,这些容器共享网络、存储、进程命名空间等资源,形成紧密协作的应用单元。Pod 的设计灵感来源于“豌豆荚”模型,容器如同豆子,共享同一环境但保持隔离性。其核心设计目标包括…...

Java CountDownLatch 用法和源码解析

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…...

Unity引擎使用HybridCLR(华佗)热更新

大家好&#xff0c;我是阿赵。   阿赵我做手机游戏已经有十几年时间了。记得刚开始从做页游的公司转到去做手游的公司&#xff0c;在面试的时候很重要的一个点&#xff0c;就是会不会用Lua。使用Lua的原因很简单&#xff0c;就是为了热更新。   热更新游戏内容很重要。如果…...

深度学习进阶:神经网络优化技术全解析

文章目录 前言一、优化问题的本质1.1 目标1.2 挑战 二、梯度下降优化算法2.1 基础SGD2.2 动量法2.3 Adam优化器 三、正则化技术3.1 L2正则化3.2 Dropout 四、学习率调度4.1 为什么要调度&#xff1f;4.2 指数衰减4.3 ReduceLROnPlateau 五、实战优化&#xff1a;MNIST案例5.1 完…...

肿瘤检测新突破:用随机森林分类器助力医学诊断

前言 你有没有想过,科技能不能在肿瘤检测中发挥巨大的作用?别着急,今天我们将带你走进一个“聪明”的世界,通过随机森林分类器进行肿瘤检测。对,你没听错,机器学习可以帮助医生更快、更准确地判断肿瘤是良性还是恶性,就像医生口袋里的“超级助手”一样,随时准备提供帮…...

DeepSeek学习 一

DeepSeek学习 一 一、DeepSeek是什么&#xff1f;二、Deepseek可以做什么&#xff1f;模型理解提问内容差异使用原则 模式认识三、如何提问&#xff1f;RTGO提示语结构CO-STAR提示语框架DeepSeek R1提示语技巧 总结 一、DeepSeek是什么&#xff1f; DeepSeek是一家专注通用人工…...

编程考古-Borland历史:《.EXE Interview》对Anders Hejlsberg关于Delphi的采访内容(上)

为了纪念Delphi在2002年2月14日发布的25周年(2020.2.12),这里有一段由.EXE杂志编辑Will Watts于1995年对Delphi首席架构师Anders Hejlsberg进行的采访记录。在这次采访中,Anders讨论了Delphi的设计与发展,以及即将到来的针对Windows 95的32位版本。 问: Delphi是如何从T…...

高并发之接口限流,springboot整合Resilience4j实现接口限流

添加依赖 <dependency><groupId>io.github.resilience4j</groupId><artifactId>resilience4j-spring-boot2</artifactId><version>1.7.0</version> </dependency><dependency><groupId>org.springframework.boot…...

电脑如何拦截端口号,实现阻断访问?

如果你弟弟喜欢玩游戏&#xff0c;你可以查询该应用占用的端口&#xff0c;结合以下方法即可阻断端口号&#xff0c;让弟弟好好学习&#xff0c;天天向上&#xff01; 拦截端口可以通过防火墙和路由器进行拦截 &#xff0c;以下是常用方法&#xff1a; 方法 1&#xff1a;使用…...

RK3588 安装ffmpeg6.1.2

在安装 ffmpeg 在 RK3588 开发板上时,你需要确保你的开发环境(例如 Ubuntu、Debian 或其他 Linux 发行版)已经设置好了交叉编译工具链,以便能够针对 RK3588 架构编译软件。以下是一些步骤和指导,帮助你安装 FFmpeg: 1. 安装依赖项 首先,确保你的系统上安装了所有必要的…...

SQL SELECT DISTINCT 语句

在 SQL 中&#xff0c;SELECT DISTINCT 语句用于从表中查询不重复的值。这对于需要从数据库检索唯一值时非常有用。DISTINCT 关键字会去除结果集中重复的行&#xff0c;只返回唯一的记录。 SELECT DISTINCT column1, column2, ... FROM table_name; column1, column2, ... 是…...

MELON的难题

MELON的难题 真题目录: 点击去查看 E 卷 200分题型 题目描述 MELON有一堆精美的雨花石(数量为n,重量各异),准备送给S和W。MELON希望送给俩人的雨花石重量一致,请你设计一个程序,帮MELON确认是否能将雨花石平均分配。 输入描述 第1行输入为雨花石个数: n,0 < n &l…...

Restful 接口设计规范

一、资源与 URL 1. 使用名词表示资源 URL 应该以名词为主&#xff0c;用来表示具体的资源&#xff0c;而不是动词。例如&#xff0c;/users 表示用户资源集合&#xff0c;/users/{id} 表示单个用户资源。 2. 采用复数形式 一般来说&#xff0c;资源的 URL 应该使用复数形式…...

Java后端高频面经——Spring、SpringBoot、MyBatis

Spring定义一个Bean有哪些方法&#xff1f;依赖注入有哪些方法&#xff1f; &#xff08;1&#xff09;定义Bean的方法 注解定义Bean&#xff0c;Component 用于标记一个类作为Spring的bean。当一个类被Component注解标记时&#xff0c;Spring会将其实例化为一个bean&#xff0…...

扩散模型中三种加入条件的方式:Vanilla Guidance,Classifier Guidance 以及 Classifier-Free Guidance

扩散模型主要包括两个过程&#xff1a;前向扩散过程和反向去噪过程。前向过程逐渐给数据添加噪声&#xff0c;直到数据变成纯噪声&#xff1b;反向过程则是学习如何从噪声中逐步恢复出原始数据。在生成过程中&#xff0c;模型从一个随机噪声开始&#xff0c;通过多次迭代去噪&a…...

Banana Pi OpenWRT One Wifi6 OpenWrt社区官方开源路由器评测

第一款不可破解、开源、版权软件、符合 FCC、CE 和 RoHS 的维修权路由器 OpenWRT项目今年已经20岁了&#xff0c;为了纪念这一时刻&#xff0c;Banana Pi OpenWrt One/AP-24.XY路由器开发系统已经上市。这是OpenWRT团队与硬件公司的第一个联合项目。选择 Banana Pi&#xff0c;…...

9.1go结构体

Go不是完全面向对象的&#xff0c;没有类的概念&#xff0c;所以结构体应该承担了更多的责任。 结构体定义 使用 type 和 struct 关键字定义&#xff1a; type Person struct { Name string Age int } 字段可以是任意类型&#xff0c;包括其他结构体或指针。 字段名以大写…...

Manus全球首个通用Agent,Manus AI:Agent应用的ChatGPT时刻

文章目录 前言Manus AI: 全球首个通用AgentManus AI: 技术架构与创始人经历AI Agent的实现框架与启示AI Agent的发展预测行业风险提示 前言 这是一篇关于Manus AI及其在通用人工智能领域的应用和前景的报告&#xff0c;主要介绍了Manus AI的产品定位、功能、技术架构、创始人经…...

【SAP-PP】生产版本维护

一、基本概念 生产版本&#xff1a;用于定义一种产品&#xff0c;不同的生产方式&#xff0c;包含物料清单&#xff08;BOM&#xff09;和工艺路线的信息&#xff0c;给生产带来更多的灵活性。在做产品需求计划时和产品生产时&#xff08;创建生产订单、生产订单下达前和生产订…...

软考 中级软件设计师 考点笔记总结 day01

文章目录 软考1.0上午考点下午考点 软考1.11、数值及其转换2、计算机内数据表示2.1、定点数 - 浮点数2.2、奇偶校验 和 循环冗余校验 (了解)2.3、海明码 &#xff08;掌握&#xff09;2.4、机器数 软考1.0 上午考点 软件工程基础知识&#xff1a; 开发模型、设计原则、测试方…...

K8s控制器Deployment详解

回顾 ReplicaSet 控制器,该控制器是用来维护集群中运行的 Pod 数量的&#xff0c;但是往往在实际操作的时候&#xff0c;我们反而不会去直接使用 RS&#xff0c;而是会使用更上层的控制器&#xff0c;比如说 Deployment。 Deployment 一个非常重要的功能就是实现了 Pod 的滚动…...

【微知】Centos如何迁移到Anolis系统的失败记录?(yum -y install centos2anolis、centos2anolis.py)

背景 本文记录如何从centos 8迁移到anolis系统。 详细步骤 下载迁移repo wget https://mirrors.openanolis.cn/anolis/migration/anolis-migration.repo -O /etc/yum.repos.d/anolis-migration.repo下载centos2anolis工具包 yum -y install centos2anolis安装额外工具包 …...

在 macOS 上使用 CLion 进行 Google Test 单元测试

介绍 Google Test&#xff08;GTest&#xff09;是 Google 开源的 C 单元测试框架&#xff0c;它提供了简单易用的断言、测试夹具&#xff08;Fixtures&#xff09;和测试运行机制&#xff0c;使 C 开发者能够编写高效的单元测试。 本博客将介绍如何在 macOS 上使用 CLion 配…...

Python SQLite3 保姆级教程:从零开始学数据库操作

Python SQLite3 保姆级教程&#xff1a;从零开始学数据库操作 本文适合纯新手&#xff01;无需任何数据库基础&#xff0c;跟着步骤操作即可掌握 SQLite3 的核心用法。 目标&#xff1a;让你像用记事本一样轻松操作数据库&#xff01; 目录 什么是 SQLite3&#xff1f;环境准…...

深度解析:视频软编码与硬编码的优劣对比

视频编码 一、基本原理与核心技术 压缩原理 通过时空冗余消除实现数据压缩&#xff1a; 空间冗余&#xff1a;利用帧内预测&#xff08;如DC/角度预测&#xff09;消除单帧内相邻像素相似性。时间冗余&#xff1a;运动估计与补偿技术&#xff08;ME/MC&#xff09;减少连续帧间…...

Azure云生态系统详解:核心服务、混合架构与云原生概念

核心服务&#xff1a;深入掌握Azure SQL Database、Azure Database for PostgreSQL、Azure Database for MySQL的架构、备份恢复、高可用性配置&#xff08;如Geo-Replication、自动故障转移组、异地冗余备份&#xff09;。混合架构&#xff1a;熟悉Azure Arc&#xff08;管理混…...

人工智能之数学基础:正交矩阵

本文重点 正交矩阵是线性代数中一个重要的特殊矩阵&#xff0c;它在许多领域都有广泛的应用。 什么是正交矩阵 如图所示&#xff0c;当矩阵A满足如上所示的条件的时候&#xff0c;此时我们就可以认为是正交矩阵&#xff0c;需要注意一点矩阵A必为方阵。 正交矩阵的充要条件 …...

分布式锁—7.Curator的分布式锁

大纲 1.Curator的可重入锁的源码 2.Curator的非可重入锁的源码 3.Curator的可重入读写锁的源码 4.Curator的MultiLock源码 5.Curator的Semaphore源码 1.Curator的可重入锁的源码 (1)InterProcessMutex获取分布式锁 (2)InterProcessMutex的初始化 (3)InterProcessMutex.…...