Option 1:Snowflake算法1分布式系统 ID 生成架构云计算Contents设计原则 ............................................................................................... 1Option 1:Snowflake算法 ........................................................................... 1Option 2 : 时间戳 + 商家标识 + 随机数 ............................................................... 2时间(位)商家标识(位)随机数(位)时间(位)商家标识(位)随机数(位)时间(位)商家标识(位)序列号(位)Option 3 : 时间戳 + 随机数 ........................................................................... 3Option 4 : 渠道号 + 时间戳 +(流水号 +用户标识+随机数) ........................................ 3生成一直是一个老生常谈的问题,个人不习惯使用自增的方式,从开始每次递增,原因是因为最近研究了一下生成的算法,主要用来给我们的订单系统用。首先说一下背景:我们的系统提供给很多经销商使用,每个经销商登录到我们的系统,发生业务、产生订单。设计原则唯一性:保证生成的不会出现重复,需要考虑分布式部署情况下的唯一性安全性:不会通过订单号泄露流水信息(比如别人通过订单号知道你一天大概多少交易量)长度:长度未明确要求,在满足其他需要的情况下应该尽量短字符集:字符未明确要求,按允许数字英文字母(大写)设计性能要求:如果按家商家上线,每家每天次订单生成,其中高峰期每分钟单,系统能支持运行年的指标来计算,每天的订单数为,高峰期每分钟为单,年为单易读性:如果使用英文字母,则可以考虑去除掉容易混淆的字母:等Option 1:Snowflake算法参考的生成算法,设计如下的规则:符号位,固定为,不使用时间戳,即当前时间到某一开始时间的毫秒数商家标识,可根据其上线时间递增序列号,每一毫秒内从开始,如果超过最大值则等待下一毫秒其中时间戳最大可支持的时间:年标识最大支持的商家数为:序列号最大支持为每秒:生成的大概像这样: Option 2 : 时间戳 + 商家标识 + 随机数2274432...278501278502278503278504...109996123808346299109996123808346300109996123808346301….264724335975583334426472433597558333452647243359755833346如果需要支持分布式部署,则可考虑将商家标识的位中插入机器标识,根据最大可能的机器节点数来选取位数。比如分配位,就可以支持台机器。同样,时间戳可以浮动,一般的系统根本不需要考虑超过年以上的情况,能用两年就不错了当然我倾向于支持年,年后如果世界末日不到,系统还在用,那就再想办法吧。Option 2 : 时间戳 + 商家标识 + 随机数时间(6位)+ 商家标识 (4位) + 随机数(4位)其中,商家标识和随机数取值范围为即种其中,商家标识最大支持的商家数为:随机数支持范围同商家标识。因时间精确到天,因此随机数每日不能重复,每天最大支持的订单数(每个商家)即为:时间(3位)+ 商家标识 (2位) + 随机数(2位)其中年、月、日各占一位,其中年可以取年份年的差值,超过则用字母表示,例如年月日,可表示为:这是简短的方案,年份只取一位则最多只可以使用年,否则会出现重复其中商家标识最大支持:每天每一个商家标识最多只能支持笔订单号,若不能满足业务需求则可以将随机数扩展为位时间(8位)+ 商家标识 (2位) + 序列号(2位)(进制)(进制)因时间精确到分钟,随机数按照每分钟递增,因此每分钟可以支持订单数:每天可支持的订单数为: Option 4 : 渠道号 + 时间戳 +(流水号 +用户标识+随机数)3Option 3 : 时间戳 + 随机数时间戳(位)随机数(位)使用位数字则每日最大只能单,使用字母则可以有单若按家商家算平均每个商家每天有单Option 4 : 渠道号 + 时间戳 +(流水号 +用户标识+随机数)其中,流水号按用户按天生成,用户标识取用户后四位,例如:流水号(位)用户标识(位)随机数(位)