目前正在测试中:完成后将开放 GitHub 代码。

请求 × Key 状态矩阵

A(获取)

Key 状态服务器动作响应时机
未注册注册(过期时间 = now+lease),签发 tokenA+token+owner+key立即
已注册且已过期续期(now+lease),签发新 tokenA+token+owner+key立即
已注册 + 有效holder + wait=0不入队T+owner+key立即
已注册 + 有效holder + wait>0入队并挂起响应AT+owner+keyrelease/expiry获取时,或wait到期返回T
queue或server capacity达到上限不入队B+owner+key立即
  • 释放路径是 FIFO 公平的:当持有者执行 R 时,会直接移交给队列最前面的 等待者(无需重新竞争,签发新 token)。
  • 只有过期路径不是 FIFO 的。
  • 即使owner与当前holder相同也不作特殊处理。它无权返回active token或续租,适用普通已占用请求规则。
  • 响应顺序可能不同于请求顺序,客户端必须按echo的owner匹配R(释放)
Key 状态服务器动作响应
已注册 + token 一致,存在等待者直接移交给队列最前面的等待者(新 token)R+token+key
已注册 + token 一致,无等待者删除该 keyR+token+key
已注册 + token 不一致不做任何操作(锁保持不变)N+token+key
未注册不做任何操作N+token+key

过期何时被处理

  • 单机模式采用惰性处理过期 —— 一个已过期的 key 会在下一次获取时被当场 接管(见上表第二行),另外还有一个每 5 秒运行一次的清扫任务,用于清理 没有等待者的过期 key。因此对一个已过期但尚未被清扫的 key 执行释放, 可能会得到 R 而不是 N
  • Cluster模式等待token校验的deadline min-heap下一项到期,然后leader通过共识commit Expire命令,key才消失。这避免node间clock差导致锁状态分裂。