分布式ID方案的要求
分布式 ID 生成方案首先要满足ID的唯一性。
在此基础上再优化,从而为业务提供更好的支持。如:
ID有意义
如果ID是有序的,或其本身就包含了相关业务的时间等其它应用系统本身的业务信息,那就有利于提高处理业务的效率。
提高数据查找效率就是最常见的好处。
服务高可用
生成ID的机器(服务)应该是高可用的,以满足分布式系统整体的高可用目标。
这可以通过主从备份或真正的分布式多服务实例来实现。
ID紧凑
过长的ID处理起来比较耗费资源。在数据库存储与索引性能方面,长ID都不如短ID表现得好。
设计ID时也需要考虑编程语言中基本数据类型是否可以方便地表示ID。
此外,如果某些场景中生成ID的需求非常密集,那么还得考虑单位时间内所能生成ID的上限是否足以支撑业务。
两种分布式ID方案
一般有两种方案:
方案一:基于数据库自增序列
优点:简单易用
缺点:
每生成一个ID都会触发一次数据库写请求,代价较高;
构建高扩展性和可靠性的解决方案比较复杂。因为会涉及数据库本身的扩展性和可靠性方案。
方案二:基于 Snowflake 的方案
优点:算法简单,对外部依赖少,性能好
缺点:存在时钟偏斜问题。计算机可能发生时钟回拨问题,导致时间戳不准确,继而产生重复ID。
可以通过设置操作系统 ntp 的