进程P1取得分布式锁后发生长时间暂停,锁租约过期;P2随后取得新锁并完成写入。此时P1恢复,仍按旧任务继续向存储写数据。为了让存储端识别并拒绝P1的陈旧写入,较合适的机制是()。
Fencing Token为每次成功获锁分配递增序号。资源端记住已接受的最大序号,后到但序号更小的旧持有者写入会被拒绝,从而弥补租约过期后的陈旧执行风险。
选项分析
正确。递增令牌让存储端比较新旧持有者,拒绝迟到的陈旧操作。
错误。进程暂停、网络延迟和故障恢复时间没有可靠固定上限,长TTL只是降低概率。
错误。没有版本边界时,旧持有者可能覆盖新结果。
错误。固定锁值无法区分持有者,还可能让旧进程误删新进程的锁。
本题为什么容易错
“锁已经过期,所以P1不能写”只是愿望。P1可能并不知道租约已经丢失,外部存储也不会自动认识锁服务的状态,除非写请求携带可校验的顺序信息。
简短答案
旧锁持有者恢复后继续写入,为什么仅检查锁值仍不够,正确答案是 A(每次获得锁时生成单调递增的Fencing Token,存储端拒绝小于已见最大Token的写入)。Fencing Token为每次成功获锁分配递增序号。资源端记住已接受的最大序号,后到但序号更小的旧持有者写入会被拒绝,从而弥补租约过期后的陈旧执行风险。
易混淆概念对比表
| 概念 | 本题判断 | 区别要点 | 记忆提示 |
|---|---|---|---|
| 每次获得锁时生成单调递增的Fencing Token,存储端拒绝小于已见最大Token的写入 | 本题正确答案 | 正确。递增令牌让存储端比较新旧持有者,拒绝迟到的陈旧操作。 | 看到题干核心场景时优先联想到它 |
| 只把锁的过期时间设得很长,并假定进程绝不会暂停更久 | 本题干扰项 | 错误。进程暂停、网络延迟和故障恢复时间没有可靠固定上限,长TTL只是降低概率。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| P1恢复后不携带任何版本信息,直接覆盖P2结果 | 本题干扰项 | 错误。没有版本边界时,旧持有者可能覆盖新结果。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| 让P1和P2共用固定锁值,便于任何进程释放锁 | 本题干扰项 | 错误。固定锁值无法区分持有者,还可能让旧进程误删新进程的锁。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
本题易混淆选项怎么区分
- 只把锁的过期时间设得很长,并假定进程绝不会暂停更久:错误。进程暂停、网络延迟和故障恢复时间没有可靠固定上限,长TTL只是降低概率。
- P1恢复后不携带任何版本信息,直接覆盖P2结果:错误。没有版本边界时,旧持有者可能覆盖新结果。
- 让P1和P2共用固定锁值,便于任何进程释放锁:错误。固定锁值无法区分持有者,还可能让旧进程误删新进程的锁。
知识点详解
分布式锁常以带过期时间的租约实现,以避免持有者故障后永久占锁。但旧持有者可能因长暂停、网络分区或超时恢复而继续执行。Fencing Token是每次成功获锁时生成的单调递增序号,写操作携带该序号,存储或下游资源拒绝比已接受序号更旧的请求。它要求资源端支持比较和持久化,不能只靠锁客户端自觉。
备考速记
锁会过期,旧进程会醒;令牌递增,资源拒旧。
Fencing Token 在陈旧写入场景中的作用
令牌可以是数据库版本号、递增序列或受控纪元。关键不是叫法,而是新持有者的值一定更大,且文件服务、数据库或设备控制端真正执行拒绝逻辑。
同类题怎么考
- 分析锁租约过期后的双持有者窗口。
- 判断Fencing Token应由谁生成、由谁校验。
Fencing Token 在系统架构设计师软考中的考法
题干出现“锁过期、旧进程恢复、覆盖新结果”,优先寻找资源端版本校验。只延长TTL、依赖客户端时钟或假设进程会及时停止,都没有封住陈旧写入。
解题思路
按时间线编号最清楚:P1拿到令牌41,暂停;租约过期后P2拿到42并写入;P1醒来虽然后到,但带的仍是41。存储端只要记住已经见过42,就能拒绝41。单纯延长过期时间不能证明暂停上限,A 才把安全判断放到了最终资源。
考点定位
锁服务只能说明某一时刻谁获得租约,无法强迫已暂停的旧进程停止。真正保护数据,需要资源端参与并校验操作的新旧顺序。
易错提醒
- Token只在客户端比较,最终存储不做拒绝检查。
- 使用随机UUID当Fencing Token,却希望通过大小判断先后。
- 锁续期失败后仍继续执行不可逆写操作。
备考提示
- 画出P1令牌41、P2令牌42和存储最大令牌三条信息。
- 把唯一锁值与Fencing Token分开:前者帮助安全释放,后者帮助资源端拒绝旧写。
你可能还想了解
- 分布式锁过期后旧持有者为什么还能写?
- Fencing Token和锁唯一值有什么区别?
- Fencing Token应该在哪里校验?
本文小结
锁租约过期后,旧进程可能恢复并继续写。递增的Fencing Token让最终资源识别操作顺序,拒绝序号更小的陈旧写入。