定时任务分片并行处理实现
摘要单节点定时任务处理海量过期订单、库存核对数据耗时久执行超时影响下一轮调度。本文基于机器 ID 数据分片并行执行定时逻辑多节点拆分数据同时处理大幅缩短任务耗时附带分片筛选核心代码bidfans 所有大批量定时清算任务采用分片方案。一、单机定时处理瓶颈单台服务器遍历全表数十万条数据清算、核对任务动辄半小时以上任务未执行完成下一轮定时触发造成重复统计无法横向扩容提升处理速度业务数据量增长后定时任务持续滞后对账、库存核对无法按时完成。 集群内每台应用节点分配唯一机器 ID定时任务根据 ID 对数据主键取模分片各节点仅处理归属自身分片数据数据互不重叠天然避免重复处理。二、数据分片筛选代码Service public class ExpireOrderTask { // 当前服务机器ID集群每台节点唯一 Value(${cluster.machine.id}) private Long machineId; // 集群总节点数量 Value(${cluster.machine.total}) private Long totalNode; public void scanExpireOrder() { // 分片筛选条件订单ID % 总节点数 当前机器ID LambdaQueryWrapperOrderDO wrapper Wrappers.lambdaQuery(); wrapper.apply(mod(order_id, {0}) {1}, totalNode, machineId); wrapper.eq(order_status, bid_success_wait_pay); wrapper.le(expire_time, LocalDateTime.now()); ListOrderDO dataList orderMapper.selectList(wrapper); for(OrderDO order : dataList){ handleExpireOrder(order); } } }新增节点仅修改总节点配置分片逻辑自动适配无需修改 SQL 业务代码数据按雪花 ID 均匀取模各节点数据量分布均衡不会出现单节点过载。三、分片与分布式锁配合分片仅拆分数据提升处理效率仍搭配分布式锁管控任务启动权仅抢占锁的节点才执行分片查询其他节点直接跳过防止多节点同时查询全表数据库压力暴涨。 单分片内部批量处理采用分页游标避免一次性加载万级数据至内存防止 OOM。任务处理进度实时记录入库中断重启可从上次进度继续执行无需从头遍历。 bidfans4 节点集群分片执行过期订单清算处理时长从 35 分钟缩短至 8 分钟对账任务每日可准时完成。四、弹性扩容适配业务数据量上涨新增服务器节点修改配置文件总节点数即可分片规则自动生效临时缩容下线节点数据自动分配至剩余机器无数据遗漏、重复清算问题。结语基于机器 ID 取模的数据分片定时方案实现多节点并行批量数据处理大幅缩短定时清算耗时搭配分布式锁、游标分页保障稳定适配代平台订单、库存海量定时核对场景。