一个进程获得锁后执行很久,锁可能先过期,另一个进程随后进入同一段业务。分布式锁需要面对租约、网络和进程暂停,不能仅凭“加锁成功”就假定副作用永远不会并发。
明确锁保护的资源与时间范围
锁键应对应真正冲突的业务范围,过大影响吞吐,过小保护不了共享资源。记录任务最长可能持续多久、是否可中断以及锁失效后应该怎样处理。
释放锁必须确认所有者
不能直接删除一个可能已经被其他执行者重新获得的锁。需要使用所选方案支持的所有权校验与原子操作。续约也可能失败,应用必须知道失去租约后的行为,而不是继续无条件写入。
关键写入还需要资源端约束
根据场景使用数据库唯一约束、版本检查、幂等记录或可验证的 fencing 机制。锁协调执行机会,最终业务正确性仍需由写入规则保护,尤其是外部系统副作用。
验收租约过期与进程暂停
让持锁工作超过租约,再恢复执行,检查是否可能出现重复或旧执行者覆盖新结果。测试中要覆盖失败路径,而不是只证明两个线程通常不会同时进入。
常见问题:把锁时间设得很长是否更安全?
可能减少过期概率,也会延长故障后的阻塞,仍无法消除所有暂停与网络问题,需要完整的业务约束。
技术参考:Redis:分布式锁。具体接口与配置请结合使用版本核对。
将评估落实到你的系统
如果内部团队需要把这些约定落到可运行的工程中,可以通过微服务基础架构建设沟通接口、公共能力与交接范围,先以一个业务场景验证方案。