为什么需要一个GUID生成服务?
1、业务实现会有限制
例如:某些业务场景批量导入功能,生成订单ID需要调用订单服务的订单ID生成来生成订单ID,支付信息的ID则需要调用支付服务来生成支付ID。
2、分库分表
分库分表时如果使用数据库自增主键,分表会受限。
为什么不用工具类等方式集成到每个工程里面?
1、业务系统集群内全局唯一
如果用工具类等方式集成到工程
优点:
1、ID为本地业务服务生成,不需要走网络调用链,性能提升
缺点:
1、业务服务可能需要关注ID生成的相关内容
要么每个工程都需要做相关配置(如:timebits、workerbits、seqbits和epohstr),要么将这些配置写死到代码。
2、业务服务生成的ID可能不是全局唯一
有什么风险
1、全局唯一ID服务挂掉业务全挂
2、可能会存在性能问题
为什么不使用MySQL自增ID?
1、MySQL自增ID限制后续业务分库分表
2、MySQL自增ID限制一些业务的简便性,例如:批量导入业务ID关联,只能先将业务数据写入数据库得到ID,然后再执行后续业务
目的
1、使用全局ID生成服务替换MySQL 自增ID
需求
1、生成全局唯一ID
2、ID有序
3、支持34年
4、单节点每秒生成65,534个ID
5、集群支持最大节点重启次数262,143次
6、接口需求(获取单个ID接口,获取N个ID接口、获取当前服务worker_node信息)
技术
1、搭建guid服务集群
2、使用百度uid-generator
3、使用MySQL数据库作为work_node记录
4、时间比特位分配:30位
5、worker比特位分配:18位
6、序列比特位分配:15位
系统架构-GUID服务
1、全局ID服务划分到整体业务架构的基础服务层
2、上层服务(应用服务层和领域服务层)使用http进行内部调用
3、上层根据服务业务场景都可以调用该服务