UidGenerator

ID生成器手册

坚强是说给别人听的谎言 提交于 2019-12-27 16:05:20
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> ID生成器手册 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识。此时一个能够生成全局唯一ID的系统是非常必要的。概括下来,那业务系统对ID号的要求有哪些呢? 需求 全局唯一性:不能出现重复的ID号,既然是唯一标识,这是最基本的要求。 趋势递增:在MySQL InnoDB引擎中使用的是聚集索引,由于多数RDBMS使用B-tree的数据结构来存储索引数据,在主键的选择上面我们应该尽量使用有序的主键保证写入性能。 单调递增:保证下一个ID一定大于上一个ID,例如事务版本号、IM增量消息、排序等特殊需求。 信息安全:如果ID是连续的,恶意用户的扒取工作就非常容易做了,直接按照顺序下载指定URL即可;如果是订单号就更危险了,竞对可以直接知道我们一天的单量。所以在一些应用场景下,会需要ID无规则、不规则。 上述123对应三类不同的场景,3和4需求还是互斥的,无法使用同一个方案满足。 同时除了对ID号码自身的要求,业务还对ID号生成系统的可用性要求极高,想象一下,如果ID生成系统瘫痪,整个美团点评支付、优惠券发券、骑手派单等关键动作都无法执行,这就会带来一场灾难。 由此总结下一个ID生成系统应该做到如下几点: 平均延迟和TP999延迟都要尽可能低; 可用性5个9; 高QPS。 实现 UUID UUID

分布式ID的简单总结

依然范特西╮ 提交于 2019-12-21 23:26:25
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 简单总结一下流行的分布式id的实现方法 雪花算法 snowflake是twitter开源的分布式ID生成算法. 核心思想是:分布式ID固定是一个long型的数字,一个long型占8个字节,也就是64个bit,原始snowflake算法中对于bit的分配如下图: 第一个bit位是标识部分,在java中由于long的最高位是符号位,正数是0,负数是1,一般生成的ID为正数,所以固定为0 时间戳部分占41bit,这个是毫秒级的时间,一般实现上不会存储当前的时间戳,而是时间戳的差值(当前时间-固定的开始时间) 这样可以使产生的ID从更小值开始;41位的时间戳可以使用69年,(1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69年 工作机器id占10bit,这里比较灵活,比如,可以使用前5位作为数据中心机房标识,后5位作为单机房机器标识,可以部署1024个节点 序列号部分占12bit,支持同一毫秒内同一个节点可以生成4096个ID snowflake算法需要人工为每台机器去指定一个机器id,如果机器很多或者机器扩展时, 挨个配置肯定不太现实,而且类似docker容器的流行, 使得这个机器id已经不能狭隘地停留在“物理”层面上了, 应该把机器id扩展为当前“实例”的id,

百度分布式id生产器UidGenerator

主宰稳场 提交于 2019-12-09 18:34:25
前言 UidGenerator是百度开源的Java语言实现,基于Snowflake算法的唯一ID生成器。而且,它非常适合虚拟环境,比如:Docker。另外,它通过消费未来时间克服了雪花算法的并发限制。UidGenerator提前生成ID并缓存在RingBuffer中。 压测结果显示,单个实例的QPS能超过6000,000。依赖环境: JDK8+ MySQL(用于分配WorkerId) snowflake 雪花算法几个核心部分: 1位sign标识位; 41位时间戳; 10位workId(数据中心+工作机器,可以其他组成方式); 12位自增序列; 百度分布式id生成器做了修改: 时间部分是28位,意味着默认只能承受8.5年(2^28-1/86400/365)。根据不同业务需求,可以适当调整delta seconds,worker node id和sequence占用位数。 UidGenerator提供两种方式:DefaultUidGenerator 和 CachedUidGenerator 。 DefaultUidGenerator delta seconds 指的是当前时间和epoch时间的时间差,单位位秒。epoch时间指的是UidGenerator生成分布式ID服务第一次上线的时间,可配置,也一定要根据你的上线时间进行配置,因为默认的epoch时间可是2016-09-20

封装一个流水号ID生成器:id-spring-boot-starter

拈花ヽ惹草 提交于 2019-12-09 18:33:59
概述 ID号生成器(或:全局唯一ID生成器)是服务端系统的基础设施,而且ID号这个东西基本搞后端开发的程序员天天都要接触。而关于ID生成的算法现在业界首屈一指的当属 Snowflake 雪花算法。 UidGenerator 正是百度开源的一款基于 Snowflake 雪花算法实现的高性能唯一ID生成器。在本号前文中已经详细使用过 UidGenerator ,但使用过程还是比较繁杂,还需要自己去引 UidGenerator 组件的源码,感觉有点不方便。为此本文基于 UidGenerator ,再来封装一套更利于 Spring Boot 项目使用的 ID 号生成组件,命名为 id-spring-boot-starter ,一看名字就知道是开箱即用的。 用法 导入SQL脚本 DROP TABLE IF EXISTS WORKER_NODE; CREATE TABLE WORKER_NODE ( ID BIGINT NOT NULL AUTO_INCREMENT COMMENT 'auto increment id', HOST_NAME VARCHAR(64) NOT NULL COMMENT 'host name', PORT VARCHAR(64) NOT NULL COMMENT 'port', TYPE INT NOT NULL COMMENT 'node type:

Spring Boot工程集成全局唯一ID生成器 UidGenerator

筅森魡賤 提交于 2019-12-09 18:15:10
本文共 823字,阅读大约需要 3分钟 ! 概述 流水号生成器(全局唯一 ID生成器)是服务化系统的基础设施,其在保障系统的正确运行和高可用方面发挥着重要作用。而关于流水号生成算法首屈一指的当属 Snowflake 雪花算法,然而 Snowflake本身很难在现实项目中直接使用,因此实际应用时需要一种可落地的方案。 UidGenerator 由百度开发,是Java实现的, 基于 Snowflake算法的唯一ID生成器。UidGenerator以组件形式工作在应用项目中, 支持自定义workerId位数和初始化策略, 从而适用于 docker等虚拟化环境下实例自动重启、漂移等场景。 本文就在项目中来集成 UidGenerator这一工程来作为项目的全局唯一 ID生成器。 注: 本文首发于 My Personal Blog ,欢迎光临 小站 本文内容脑图如下: 基础工程创建 只需创建一个 Multi-Moudule的 Maven项目即可,然后我们集成进两个 Module: uid-generator : 源码在此 uid-consumer :消费者( 使用uid-generator产生全局唯一的流水号 ) uid-generator 模块我就不多说了,源码拿过来即可,无需任何改动;而关于 uid-consumer 模块,先在 pom.xml中添加相关依赖如下: