集群高并发情况下,通过SnowFlake雪花算法保证生成分布式唯一全局ID

一、需要分布式全局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示例:

猜你喜欢

转载自blog.csdn.net/loulanyue_/article/details/106356157