系统架构设计师 · 高频练习

旧锁持有者恢复后继续写入,为什么仅检查锁值仍不够?

高级 单选题 第 1055 题 较难 系统架构设计师分布式锁Fencing Token租约陈旧写入
题目

进程P1取得分布式锁后发生长时间暂停,锁租约过期;P2随后取得新锁并完成写入。此时P1恢复,仍按旧任务继续向存储写数据。为了让存储端识别并拒绝P1的陈旧写入,较合适的机制是()。

A 每次获得锁时生成单调递增的Fencing Token,存储端拒绝小于已见最大Token的写入
B 只把锁的过期时间设得很长,并假定进程绝不会暂停更久
C P1恢复后不携带任何版本信息,直接覆盖P2结果
D 让P1和P2共用固定锁值,便于任何进程释放锁
题目类型:原创高频练习题 用途:用于帮助理解系统架构设计师相关考点和答案解析,不等同于官方真题。
正确答案
A
答案解析

Fencing Token为每次成功获锁分配递增序号。资源端记住已接受的最大序号,后到但序号更小的旧持有者写入会被拒绝,从而弥补租约过期后的陈旧执行风险。

选项分析

A

正确。递增令牌让存储端比较新旧持有者,拒绝迟到的陈旧操作。

B

错误。进程暂停、网络延迟和故障恢复时间没有可靠固定上限,长TTL只是降低概率。

C

错误。没有版本边界时,旧持有者可能覆盖新结果。

D

错误。固定锁值无法区分持有者,还可能让旧进程误删新进程的锁。

本题为什么容易错

“锁已经过期,所以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让最终资源识别操作顺序,拒绝序号更小的陈旧写入。