1、需求背景
在大型分布式系统中,需要对大量数量进行唯一标识。一般来说,我们需要两种类型的全局唯一标识:主键形式的(mysql 索引特性,用整形自增方式);业务模式的,如订单号,需要冗余一些业务特性,如业务类型+团队标识+时间+机器+序列。但不管哪种方式,一般都有下列特性: 1、全局唯一; 2、高并发,高性能(1000个并发,1000000W数据,18S内完成); 3、高可靠,容错单点故障; 4、易扩展,易迁移。2、操作环境:
Mysql 5.83、全局ID生成方案
我们常用的ID生成器方案如下:3.1 数据库自增
mysql auto_increment 自增: 优点:单库单表下,简单快捷; 不足: 单库下,数据库压力大,无可靠性,一挂全挂.不易扩展,分布式下无法简单保障唯一。3.2 UUID
优点: 无需数据库介入,就可以全局唯一; 不足: 长度为128位,存储空间大; 非自增,无法排序,特别是用在MYSQL中索引时; 可读性不佳。3.3 redis方案
优点: 比数据库性能高; 可以自增; 不足: 需要引入redis组件; 增加运维成本;3.4 Zookeeper方案
通过znode生成32位或者64位数据库版本号,很少用到,因为需要zookpeeker,而且是多步调用API,在高并发下表现不是很理想。
3.5 雪花算法:
twitter开源的算法,很多企业所用的都是根据此算法再结合本身业务需求进行改造的。
优点:1、简单轻量,无需要依赖其它
2、支持高并发,并高性能。
不足: 如果用于做业务ID,可读性不好。