10 | 发号器:如何保证分库分表后ID的全局唯一性?
建议你搭建发号器服务来生成全局唯一的 ID。
怎么不用UUID?
因为在系统设计时,ID 有可能成为排序的字段。
ID 有序也会提升数据的写入性能。
不能作为 ID 的另一个原因是它不具备业务含义
最后,UUID 是由 32 个 16 进制数字组成的字符串,如果作为数据库主键使用比较耗费空间。
Snowflake 算法设计的非常简单且巧妙,性能上也足够高效,同时也能够生成具有全局唯一性、单调递增性和有业务含义的 ID,但是它也有一些缺点,其中最大的缺点就是它依赖于系统的时间戳,一旦系统时间不准,就有可能生成重复的 ID。所以如果我们发现系统时钟不准,就可以让发号器暂时拒绝发号,直到时钟准确为止。
主要的问题是,如果超出了4096个,你要怎么处理?如果时钟错乱,你要怎么处理?