分布式架构下,唯一序列号生成是我们在设计一个系统,尤其是数据库使用分库分表的时候常常会遇见的问题。当分成若干个sharding表后,如何能够快速拿到一个唯一序列号,是经常遇到的问题。
现目前市面上有很多的解决方案,那么我们应该怎么选择?
首先思考🤔你需要的全局唯一ID 需要具备什么特性?(根据需求来定,一般从这些方面考虑)
- 全局唯一
- 支持高并发
- 能够体现一定属性
- 高可靠,容错单点故障
- 高性能,每秒能生成数量
- 是否要求不可推算准确唯一ID(部门可推算+部分不可推算部分)
以下是一些基本的方式,供参考,根据实际需求自己调整。
UUID
常见的方式。可以利用数据库也可以利用程序生成,一般来说全球唯一。
优点:
- 1)简单,代码方便。
- 2)生成ID性能非常好,基本不会有性能问题。
- 3)全球唯一,在遇见数据迁移,系统数据合并,或者数据库变更等情况下,可以从容应对。
缺点:
- 1)没有排序,无法保证趋势递增。
- 2)UUID往往是使用字符串存储,查询的效率比较低。
- 3)存储空间比较大,如果是海量数据库,就需要考虑存储量的问题。
- 4)传输数据量大
- 5)不可读。
优化方案:
- 1)为了解决UUID不可读,可以使用UUID to Int64的方法。
- 2)为了解决UUID无序的问题,NHibernate在其主键生成方式中提供了Comb算法(combined guid/timestamp)。保留GUID的10个字节,用另6个字节表示GUID生成的时间(DateTime)。 </