浅谈全局唯一ID的生成方案
业务系统Id必须具有唯一性的要求,在此之上还需要高可用,趋势增长的特点;常见有下面四种方法生成Id
1.UUID
本地直接生成Id,不需要远程调用,延时低,扩展性好,基本上没有性能上限;但是没有办法保证趋势递增,uuid一般比较长,用字符串标识,作为主键索引查询效率低
2.数据库递增
使用数据库已有的功能,使用简单,能够保证唯一性和递增型;但是可用性难以保证,数据库一般是一主多从的结构,如果主库挂了,就玩不了了,数据库的性能决定了Id生成的性能,可以通过增加主库,避免单点写入,每个数据库设置不同的初始值以及相同的增长步值,保证了可用性,但是失去了绝对增长的可用性,但这个问题不大,但是每次生成Id,还是要访问数据库,数据库的瓶颈还是存在
3.Id生成服务+sequence
主键规则为当前毫秒数(long)+sequence;通过新建一个数据库表,字段包含表名,初始值,最大值;每个数据库表都需要在这个表配置一条记录,在Id生成的服务当中回一次性拿去接下的一批sequence,缓存在数据库当中,这样每次生成Id的时候不要都访问数据库了,Id生成服务可以采用集群,当主服务挂了,其他服务可以顶上,这个切换的过程也是透明能自动完成,不过生成出来的id可能不是连续的,不过问题不大
4.类snowflake算法
snowflake算法是twitter开源的分布式Id生成算法,核心算法是一个long类型的Id,其中前41位是当前毫秒数,中间10位是机器编码,最后12位作为sequence,理论上一秒能生成400万的Id,性能完全够;将毫秒数放在高位上,保证每台服务器生成的Id是有序的,但是不能保证同一毫秒内不同的服务器生成的Id是有序的