分布式 原理的核心应该算是一致系统设计,而不是一种技术 mysql
分布式惟一单号的设计都必须有必定的格式,纯随机没法实现惟一单号, 格式能够解决分布式问题
GUID/UUID 工具生成, 用到了 redis
当前日期和时间,UUID的第一个部分与时间有关,若是你在生成一个UUID以后,过几秒后又生成了一个UUID,则第一个部分不一样,其他相同。
时钟序列。
全局惟一的IEEE机器识别号,若是有网卡,从网卡MAC地址得到,没有网卡以其余方式得到。—(mac地址这部分能够解决分布式问题,不通机器由于这部分不一样,因此不一样机器生成单号确定不一样 )算法
UUID的惟一缺陷在于生成的结果穿会比较长。关于UUID这个标准使用最广泛的是微软的GUID(Globals Ujique Identifiersspring
SnowFlake https://blog.csdn.net/li396864285/article/details/54668031sql
在分布式系统中不一样机器产生的id必须不一样.Snowflake算法核心把时间戳,工做机器id,序列号(毫秒级时间41位+机器ID 10位+毫秒内序列12位)组合在一块儿。
会员团队 > 单号生成组件 > image2021-1-28_11-56-57.png安全
机器id 解决了分布式问题springboot
mysql , redis 自增markdown
最终由一台机器,一个线程实现的,固定的就是一个特殊隐藏格式"空"
总结来讲”分布式“ 严格 惟一单号生的条件有3点
1 有固定格式 机器标识 (记做“机器标识”) + 经过线程安全方式生成的惟一标识(这里记做“随机数”) + 不一样标识段有有分割符(包含隐形分割符如:机器标识长度固定,那么机器分割符以后为空的方式也算固定分割符, 机器1&abc, 和机器1abc, 这2种效果同样)网络
2有惟一机器标识,(myqsql, redis 这种也能够说是有标识,空标识,由于最终就一台机器)jvm
3 单机生成标识中 随机数生成必须线程安全
方式1 (严格惟一) 单号最终组生成的机器:业务机器
格式: yyyyMMssSSS+ redis 自增(key 为MinuteOfHour, 过时时间 1分钟)
机器标识:隐形空(统一redis 机器)
随机数标识:redis 自增num(key 为MinuteOfHour, 过时时间 1分钟)
弊端: redis 可用性依赖性高:业务服务须要接入redis
方式2:(严格惟一) 单号最终组生成的机器:业务机器
格式:jvm 机器编号 +( yyyyMMssSSS+ 线程安全生成一秒钟的惟编号)
机器标识:jvm 机器编号
随机数标识:( yyyyMMssSSS+ 线程安全生成一秒钟的惟编号)
弊端: 每台机器都要手动配置机器编号
方式3:(严格惟一)单号最终组生成的机器: 统一单号生成服务
格式:: yyyyMMssSSS+ redis 自增(key 为调用方编号+MinuteOfHour, 过时时间 1分钟)
机器标识: 机器编号隐形空(统一redis 机器)
随机数标识: redis 自增(key 为调用方编号+MinuteOfHour, 过时时间 1分钟)
弊端: 单号服务要保证搞可用
方式4:(严格惟一)单号最终组生成的机器: 统一单号生成服务, 或者业务自己均可以
格式 : 任意编号标识 + 经过记录惟一id置换编号 (也能够抽象的说全部的数据都不重复的格式)
机器标识:机器编号隐形空 (能够认为是存储单号库的仓库 mysql等)
随机数标识: 存储单号库 提早已经去重
解释一下:单号仓库要提早生成一批去重以后的惟一编号,业务需经过惟一id (分表的能够再作扩展), 换取仓库种的惟一编号
弊端:要维护一套单号仓库
方式5:(不严格惟一) 单号最终组生成的机器:业务机器----
格式:: yyyyMMssSSS+ uid + 一位英文字符+ 2位 随机字符(从26个英文字母+10个阿拉伯数字中随机)
机器标识:无
随机数标识: yyyyMMssSSS+ uid + 一位英文字符+ 2位 随机字符
弊端: 同一个用户的单号有重复的可能)
最终选择方案2:
理由:
1 目前的需求须要严格的单号惟一 (排除方案5)
2 单号生成依赖外部服务,服务的稳定性没法保证(排除3, 4)
3 创建单号库 接入代价过大 (排除方案 4)
4 目前公司的redis 服务自己稳定性没有保障,每次请求redis 获取单号也有网络开销 (排除方案2)
方案2 具体到业务细节
惟一单号3个条件以下: 单号最终组生成的机器:业务机器
格式:yyyyMMddHHmmss(14) + 机器编号(8位)+ 随机编码(4位)
机器标识:系统启动的时候 经过http 访问统一的机器编码服务
随机数标识:机器本地使用线程安全方式获取4位惟一编码 (1秒内)
功能更实现作的工做
提供一个机器编码管理工具,为机器生成惟一机器编码服务,
提供一个springboot-start,接入方引入pom文件就完成了接入
以上规则 为我的总结若有不一样看法能够留言讨论,实施过程若有疑问 ,也能够留言,看到会回复解答