一、需要分布式全局ID的场景
在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识
如在美团点评的金融、支付、餐饮、酒店;猫眼电影等产品的系统中数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息;
特别一点的如订单、骑手、优惠券也都需要有唯一ID做标识,此时一个能够生成全局唯一ID的系统是非常必要的
二、生成ID的常用解决方案
UUID = ==>>> 存入数据库性能差
数据库自增主键 = ==>>> 适合单机,不适合集群
基于Redis生成全局id策略 = ==>>> 集群配置繁琐
三、Twitter(推特)的SnowFlake(雪花算法)的作用
Twitter的分布式雪花算法SnowFlake,经测试SnowFlake每秒能够产生26万哥自增可排序ID
1.Twitter的SnowFlake生成ID能够按照时间有序生成
2.SnowFlake算法生成ID的结果是一个64bit大小的整数,为一个Long型,转换成字符串后长度最多19
3.分布式系统内不会产生ID碰撞(由datacenter和workerId做区分)并且效率较高
优点:
1.毫秒数在高位,自增序列在低位,整个ID都是趋势递增的
2.不依赖数据库等三方系统,以服务的方式部署,稳定性更高,生成ID的性能也是非常高的
3.可以根据自身业务特性分配bit位,非常灵活
缺点:
1.依赖机器时钟,如果机器时钟回拨,会导致重复ID生成
2.在单机上是递增的,但是由于涉及到分布式环境,每台机器上的时钟不可能完全同步,有时候会出现不是全局递增的情况
四、通过小而美的hutool工具,落地SnowFlake雪花算法
maven依赖:
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-captcha</artifactId>
<version>5.2.0</version>
</dependency>
Java示例: