标准答案
- 进程可能因 GC、系统暂停或网络分区错过续租,锁在服务端过期后被新请求获取;旧进程恢复后仍可能继续执行本地代码。
- 续租只能在 token 一致且任务仍健康时延长租约,不能把租约无限拉长,也不能消除网络分区下双方各自认为成功的情况。
- fencing token 是单调递增的租约编号。每次获得锁拿到更大的编号,写数据库、文件存储或下游服务时携带该编号,资源端只接受大于当前已见编号的请求。
- 若最终资源不校验 token,fencing token 只是日志字段。需要把比较放在真正写入点,例如带版本条件的 UPDATE、存储层条件写或下游 API 的幂等序号。
题目解析
这题的关键是承认分布式系统不能靠“我还在续租”证明独占性。锁服务看到的是租约,业务资源看到的是写入;两者之间必须有可验证的顺序屏障。
对大多数普通业务,数据库唯一约束、版本号和状态机比实现带 fencing 的锁更经济。只有确实需要跨实例排他执行且下游可校验时才值得引入。
常见误区
- 认为自动续租后锁就不会失效,忽略进程长暂停和网络隔离。
- 生成 fencing token 却没有让数据库或下游拒绝旧编号。