标准答案
- 雪花类方案把时间戳、节点 ID 和同毫秒序列组合成 ID,节点 ID 必须唯一。
- 同一节点同一时间片内用原子序列保证并发唯一,序列耗尽时等待下一时间片。
- 检测到时钟回拨时按回拨幅度选择等待、逻辑时间或报错,并监控节点配置和生成延迟。
题目解析
雪花类 ID 把时间、节点和序列拼成一个可排序的唯一值,同一节点同一时间片用序列解决并发。节点 ID 分配和回收是系统的一部分,不能默认每个实例天然唯一。
唯一、趋势递增和跨节点严格有序是不同目标。网络延迟、时钟差异和多节点并发会让全局严格顺序需要协调,通常要牺牲吞吐或可用性。
时钟回拨要按幅度处理:短暂回拨可以等待或使用逻辑时间,严重回拨应拒绝生成并告警。序列耗尽也要等待下一时间片,不能静默复用。
代码示例
字段布局示意:
TypeScript
id = (timestamp << (nodeBits + sequenceBits))
| (nodeId << sequenceBits)
| sequence常见误区
- 误区:随机数就一定不会冲突。改正:选择足够的空间并配合唯一约束或碰撞检测,随机只降低概率。
- 误区:多个实例使用同一个 nodeId。改正:通过注册、租约或配置中心保证节点 ID 唯一且可回收。
- 误区:时钟回拨后继续使用旧时间戳。改正:等待、使用受控逻辑时间或失败告警,不能生成可能重复的 ID。