代拍系统存在大量定时任务汇率同步、过期议价清理、库存核对、消息重试、资金对账。多服务节点同时部署时同一任务会重复执行。多节点定时任务冲突的危害未加锁场景下多台服务器同时触发对账、清理任务重复执行资金对账生成多条重复财务报表批量清理过期议价多次扣减用户手续费批量推送消息造成用户收到多条相同通知分布式锁方案所有定时任务执行前尝试抢占任务专属锁Key锁过期时间大于任务预估最大执行时长。抢占锁成功才执行业务逻辑抢占失败直接结束本次调度。importredisimporttimefromfunctoolsimportwrapsclassDistributedLock:Redis分布式锁def__init__(self,redis_client):self.redisredis_clientdeflock(self,key:str,expire:int300)-bool:尝试获取锁expire单位秒# SET NX EX 原子操作returnself.redis.set(key,str(time.time()),nxTrue,exexpire)defunlock(self,key:str):释放锁self.redis.delete(key)defwith_lock(self,lock_key:str,expire:int300):装饰器自动加锁解锁defdecorator(func):wraps(func)defwrapper(*args,**kwargs):ifnotself.lock(lock_key,expire):print(fTask{lock_key}already running, skip)returnNonetry:returnfunc(*args,**kwargs)finally:self.unlock(lock_key)returnwrapperreturndecorator# 使用示例distributed_lock.with_lock(task:expire_cleanup,expire600)defcleanup_expired_orders():清理过期订单锁过期时间大于任务预估最大执行时长# 业务逻辑pass 任务分片优化 海量数据定时处理采用分片机制通过机器编号拆分数据区间各节点仅处理分片内数据 pythonclassShardedTask:分片任务基类def__init__(self,total_shards:int4):self.total_shardstotal_shards self.node_idself.get_node_id()# 从环境变量获取defget_shard_range(self,total_count:int)-tuple:计算当前节点负责的数据区间shard_sizetotal_count//self.total_shards startself.node_id*shard_size endstartshard_sizeifself.node_idself.total_shards-1elsetotal_countreturnstart,enddefprocess_shard(self):处理分片数据# 获取总数据量totalself.get_total_count()start,endself.get_shard_range(total)# 只处理[start, end)范围内的数据dataself.fetch_data(start,end)foritemindata:self.process_item(item)线上效果Bidfans部署4台应用节点接入分布式锁管控定时任务后彻底消除重复执行故障。分片处理机制将每日过期数据清理耗时从40分钟缩短至12分钟。锁超时时间支持后台配置可根据数据量动态调整。这套方案让Bidfans系统的定时任务在集群环境下稳定运行无论是汇率同步还是资金对账都不再出现重复执行的问题。思考你们的定时任务有没有遇到过重复执行的问题是怎么解决的