分布式唯一单号生成

分布式 原理的核心应该算是一致系统设计,而不是一种技术

分布式唯一单号的设计都必须有一定的格式,纯随机无法实现唯一单号, 格式可以解决分布式问题
GUID/UUID 工具生成, 用到了

当前日期和时间,UUID的第一个部分与时间有关,如果你在生成一个UUID之后,过几秒后又生成了一个UUID,则第一个部分不同,其余相同。
时钟序列。
全局唯一的IEEE机器识别号,如果有网卡,从网卡MAC地址获得,没有网卡以其他方式获得。—(mac地址这部分可以解决分布式问题,不通机器因为这部分不同,所以不同机器生成单号肯定不同 )

UUID的唯一缺陷在于生成的结果穿会比较长。关于UUID这个标准使用最普遍的是微软的GUID(Globals Ujique Identifiers

SnowFlake https://blog.csdn.net/li396864285/article/details/54668031

          在分布式系统中不同机器产生的id必须不同.Snowflake算法核心把时间戳,工作机器id,序列号(毫秒级时间41位+机器ID 10位+毫秒内序列12位)组合在一起。

会员团队 > 单号生成组件 > image2021-1-28_11-56-57.png

机器id 解决了分布式问题

mysql , redis 自增

  最终由一台机器,一个线程实现的,固定的就是一个特殊隐藏格式"空"

总结来说”分布式“ 严格 唯一单号生的条件有3点
1 有固定格式 机器标识 (记作“机器标识”) + 通过线程安全方式生成的唯一标识(这里记作“随机数”) + 不同标识段有有分割符(包含隐形分割符如:机器标识长度固定,那么机器分割符之后为空的方式也算固定分割符, 机器1&abc, 和机器1abc, 这2种效果一样)

2有唯一机器标识,(myqsql, redis 这种也可以说是有标识,空标识,因为最终就一台机器)

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文件就完成了接入

猜你喜欢

转载自blog.51cto.com/chaojiit/2616661