标准答案

  1. 雪花类方案把时间戳、节点 ID 和同毫秒序列组合成 ID,节点 ID 必须唯一。
  2. 同一节点同一时间片内用原子序列保证并发唯一,序列耗尽时等待下一时间片。
  3. 检测到时钟回拨时按回拨幅度选择等待、逻辑时间或报错,并监控节点配置和生成延迟。

题目解析

雪花类 ID 把时间、节点和序列拼成一个可排序的唯一值,同一节点同一时间片用序列解决并发。节点 ID 分配和回收是系统的一部分,不能默认每个实例天然唯一。

唯一、趋势递增和跨节点严格有序是不同目标。网络延迟、时钟差异和多节点并发会让全局严格顺序需要协调,通常要牺牲吞吐或可用性。

时钟回拨要按幅度处理:短暂回拨可以等待或使用逻辑时间,严重回拨应拒绝生成并告警。序列耗尽也要等待下一时间片,不能静默复用。

代码示例

字段布局示意:

TypeScript
id = (timestamp << (nodeBits + sequenceBits))
  | (nodeId << sequenceBits)
  | sequence

常见误区

  • 误区:随机数就一定不会冲突。改正:选择足够的空间并配合唯一约束或碰撞检测,随机只降低概率。
  • 误区:多个实例使用同一个 nodeId。改正:通过注册、租约或配置中心保证节点 ID 唯一且可回收。
  • 误区:时钟回拨后继续使用旧时间戳。改正:等待、使用受控逻辑时间或失败告警,不能生成可能重复的 ID。

作者信息