哈喽,大家好,我是了不起。
国内很多软件都使用Mybatis-plus,同时也会使用到其生成ID的算法。
最近遇到了同一服务在并发的情况下不同实例自动生成的id相同的问题。
问题原因
- 时钟回拨(最常见原因)
- 服务器时间被手动调整或NTP同步导致时间倒退
- 雪花算法严重依赖系统时钟,回拨会导致生成重复ID
- WorkerID 分配冲突
- 分布式环境中多个实例使用了相同的 workerId/datacenterId
- MyBatis-Plus 默认使用
DefaultIdentifierGenerator,workerId 默认取0
- 并发量超过算法限制
- 单个实例1ms内生成ID超过4096个(序列号耗尽)
- 默认配置:1位符号位 + 41位时间戳 + 10位机器ID + 12位序列号
- 虚拟机快照恢复
- 使用虚拟机快照回滚后时间倒流但workerId未变