From e66f100409d5d6119ca12ed1fa02eca8952ffc42 Mon Sep 17 00:00:00 2001 From: junwu215177 Date: Wed, 20 Feb 2019 17:34:20 +0800 Subject: [PATCH 01/10] 1.0.2 --- README.md | 321 ++++------------- README.zh_cn.md | 278 --------------- doc/cacheline_padding.png | Bin 135026 -> 0 bytes doc/ringbuffer.png | Bin 54080 -> 0 bytes doc/snowflake.png | Bin 16411 -> 0 bytes doc/throughput1.png | Bin 56371 -> 0 bytes doc/throughput2.png | Bin 53327 -> 0 bytes doc/throughput3.png | Bin 53852 -> 0 bytes pom.xml | 100 ++---- .../wujun234}/uid/BitsAllocator.java | 4 +- .../github/wujun234/uid/UidAutoConfigure.java | 51 +++ .../wujun234}/uid/UidGenerator.java | 4 +- .../uid/buffer/BufferPaddingExecutor.java | 7 +- .../uid/buffer/BufferedUidProvider.java | 2 +- .../uid/buffer/RejectedPutBufferHandler.java | 2 +- .../uid/buffer/RejectedTakeBufferHandler.java | 2 +- .../wujun234}/uid/buffer/RingBuffer.java | 5 +- .../uid/exception/UidGenerateException.java | 2 +- .../uid/impl/CachedUidGenerator.java | 96 +++-- .../uid/impl/DefaultUidGenerator.java | 120 ++++--- .../wujun234/uid/impl/UidProperties.java | 113 ++++++ .../wujun234}/uid/utils/DateUtils.java | 2 +- .../wujun234}/uid/utils/DockerUtils.java | 208 +++++------ .../wujun234}/uid/utils/EnumUtils.java | 128 +++---- .../uid/utils/NamingThreadFactory.java | 328 +++++++++--------- .../wujun234}/uid/utils/NetUtils.java | 168 ++++----- .../wujun234}/uid/utils/PaddedAtomicLong.java | 2 +- .../wujun234}/uid/utils/ValuedEnum.java | 2 +- .../worker/DisposableWorkerIdAssigner.java | 30 +- .../uid/worker/WorkerIdAssigner.java | 10 +- .../wujun234}/uid/worker/WorkerNodeType.java | 6 +- .../uid/worker/dao/WorkerNodeDAO.java | 35 +- .../uid/worker/entity/WorkerNodeEntity.java | 5 +- .../META-INF/mybatis/mapper/WORKER_NODE.xml | 47 --- src/main/resources/META-INF/spring.factories | 1 + src/main/scripts/WORKER_NODE.sql | 2 +- .../wujun234}/uid/CachedUidGeneratorTest.java | 258 +++++++------- .../uid/DefaultUidGeneratorTest.java | 245 ++++++------- .../wujun234/uid/UidTestApplication.java | 25 ++ src/test/resources/application.yml | 24 ++ src/test/resources/uid/cached-uid-spring.xml | 39 --- src/test/resources/uid/default-uid-spring.xml | 22 -- src/test/resources/uid/mybatis-spring.xml | 80 ----- src/test/resources/uid/mysql.properties | 23 -- 44 files changed, 1184 insertions(+), 1613 deletions(-) delete mode 100644 README.zh_cn.md delete mode 100644 doc/cacheline_padding.png delete mode 100644 doc/ringbuffer.png delete mode 100644 doc/snowflake.png delete mode 100644 doc/throughput1.png delete mode 100644 doc/throughput2.png delete mode 100644 doc/throughput3.png rename src/main/java/com/{baidu/fsg => github/wujun234}/uid/BitsAllocator.java (96%) create mode 100644 src/main/java/com/github/wujun234/uid/UidAutoConfigure.java rename src/main/java/com/{baidu/fsg => github/wujun234}/uid/UidGenerator.java (91%) rename src/main/java/com/{baidu/fsg => github/wujun234}/uid/buffer/BufferPaddingExecutor.java (97%) rename src/main/java/com/{baidu/fsg => github/wujun234}/uid/buffer/BufferedUidProvider.java (96%) rename src/main/java/com/{baidu/fsg => github/wujun234}/uid/buffer/RejectedPutBufferHandler.java (96%) rename src/main/java/com/{baidu/fsg => github/wujun234}/uid/buffer/RejectedTakeBufferHandler.java (96%) rename src/main/java/com/{baidu/fsg => github/wujun234}/uid/buffer/RingBuffer.java (99%) rename src/main/java/com/{baidu/fsg => github/wujun234}/uid/exception/UidGenerateException.java (97%) rename src/main/java/com/{baidu/fsg => github/wujun234}/uid/impl/CachedUidGenerator.java (67%) rename src/main/java/com/{baidu/fsg => github/wujun234}/uid/impl/DefaultUidGenerator.java (64%) create mode 100644 src/main/java/com/github/wujun234/uid/impl/UidProperties.java rename src/main/java/com/{baidu/fsg => github/wujun234}/uid/utils/DateUtils.java (98%) rename src/main/java/com/{baidu/fsg => github/wujun234}/uid/utils/DockerUtils.java (95%) rename src/main/java/com/{baidu/fsg => github/wujun234}/uid/utils/EnumUtils.java (94%) rename src/main/java/com/{baidu/fsg => github/wujun234}/uid/utils/NamingThreadFactory.java (96%) rename src/main/java/com/{baidu/fsg => github/wujun234}/uid/utils/NetUtils.java (95%) rename src/main/java/com/{baidu/fsg => github/wujun234}/uid/utils/PaddedAtomicLong.java (97%) rename src/main/java/com/{baidu/fsg => github/wujun234}/uid/utils/ValuedEnum.java (96%) rename src/main/java/com/{baidu/fsg => github/wujun234}/uid/worker/DisposableWorkerIdAssigner.java (71%) rename src/main/java/com/{baidu/fsg => github/wujun234}/uid/worker/WorkerIdAssigner.java (75%) rename src/main/java/com/{baidu/fsg => github/wujun234}/uid/worker/WorkerNodeType.java (89%) rename src/main/java/com/{baidu/fsg => github/wujun234}/uid/worker/dao/WorkerNodeDAO.java (53%) rename src/main/java/com/{baidu/fsg => github/wujun234}/uid/worker/entity/WorkerNodeEntity.java (96%) delete mode 100644 src/main/resources/META-INF/mybatis/mapper/WORKER_NODE.xml create mode 100644 src/main/resources/META-INF/spring.factories rename src/test/java/com/{baidu/fsg => github/wujun234}/uid/CachedUidGeneratorTest.java (87%) rename src/test/java/com/{baidu/fsg => github/wujun234}/uid/DefaultUidGeneratorTest.java (84%) create mode 100644 src/test/java/com/github/wujun234/uid/UidTestApplication.java create mode 100644 src/test/resources/application.yml delete mode 100644 src/test/resources/uid/cached-uid-spring.xml delete mode 100644 src/test/resources/uid/default-uid-spring.xml delete mode 100644 src/test/resources/uid/mybatis-spring.xml delete mode 100644 src/test/resources/uid/mysql.properties diff --git a/README.md b/README.md index 3224378..806fe11 100644 --- a/README.md +++ b/README.md @@ -1,101 +1,28 @@ -UidGenerator +uid-generator-spring-boot-starter ========================== -[In Chinese 中文版](README.zh_cn.md) - -UidGenerator is a Java implemented, [Snowflake](https://github.com/twitter/snowflake) based unique ID generator. It -works as a component, and allows users to override workId bits and initialization strategy. As a result, it is much more -suitable for virtualization environment, such as [docker](https://www.docker.com/). Besides these, it overcomes -concurrency limitation of Snowflake algorithm by consuming future time; parallels UID produce and consume by caching -UID with RingBuffer; eliminates CacheLine pseudo sharing, which comes from RingBuffer, via padding. And finally, it -can offer over 6 million QPS per single instance. - -Requires:[Java8](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)+, -[MySQL](https://dev.mysql.com/downloads/mysql/)(Default implement as WorkerID assigner; If there are other implements, MySQL is not required) - -Snowflake -------------- -![Snowflake](doc/snowflake.png) -** Snowflake algorithm:** An unique id consists of worker node, timestamp and sequence within that timestamp. Usually, -it is a 64 bits number(long), and the default bits of that three fields are as follows: - -* sign(1bit) - The highest bit is always 0. - -* delta seconds (28 bits) - The next 28 bits, represents delta seconds since a customer epoch(2016-05-20). The maximum time will be 8.7 years. - -* worker id (22 bits) - The next 22 bits, represents the worker node id, maximum value will be 4.2 million. UidGenerator uses a build-in - database based ```worker id assigner``` when startup by default, and it will dispose previous work node id after - reboot. Other strategy such like 'reuse' is coming soon. - -* sequence (13 bits) - the last 13 bits, represents sequence within the one second, maximum is 8192 per second by default. - -**The parameters above can be configured in spring bean** - - -CachedUidGenerator -------------------- -RingBuffer is an array,each item of that array is called 'slot', every slot keeps a uid or a flag(Double RingBuffer). -The size of RingBuffer is 2^n, where n is positive integer and equal or greater than bits of -```sequence```. Assign bigger value to ```boostPower``` if you want to enlarge RingBuffer to improve throughput. - -###### Tail & Cursor pointer -* Tail Pointer - - Represents the latest produced UID. If it catches up with cursor, the ring buffer will be full, at that moment, no put - operation should be allowed, you can specify a policy to handle it by assigning - property ```rejectedPutBufferHandler```. - -* Cursor Pointer - - Represents the latest already consumed UID. If cursor catches up with tail, the ring buffer will be empty, and - any take operation will be rejected. you can also specify a policy to handle it by assigning - property ```rejectedTakeBufferHandler```. - -![RingBuffer](doc/ringbuffer.png) - -CachedUidGenerator used double RingBuffer,one RingBuffer for UID, another for status(if valid for take or put) - -Array can improve performance of reading, due to the CUP cache mechanism. At the same time, it brought the side -effect of 「False Sharing」, in order to solve it, cache line padding is applied. - -![FalseSharing](doc/cacheline_padding.png) - -#### RingBuffer filling -* Initialization padding - During RingBuffer initializing,the entire RingBuffer will be filled. - -* In-time filling - Whenever the percent of available UIDs is less than threshold ```paddingFactor```, the fill task is triggered. You can - reassign that threshold in Spring bean configuration. - -* Periodic filling - Filling periodically in a scheduled thread. The```scheduleInterval``` can be reassigned in Spring bean configuration. - +基于 [百度UidGenerator](https://github.com/baidu/uid-generator), 做了以下改动: +- 改造为spring-boot-starter的形式,建表、引入,即可使用 +- 针对时钟回拨,提供了修正选项(默认启用,可通过配置关闭),小于阈值直接休眠,大于阈值更改机器号 +- 对机器id用尽提供了复用策略:取余 +- 解除id位数限制,由“必须64位”改为“不大于64位”,可根据需要获取更短id + +参数均可通过Spring进行自定义,默认参数为: +- delta seconds (30 bits) +当前时间,相对于时间基点"2019-02-20"的增量值,单位:秒,最多可支持约34年,超出抛异常 +- worker id (16 bits) +机器id,最多可支持约6.5w次机器启动。内置实现为在启动时由数据库分配,默认分配策略为用后即弃,当前复用策略为取余。 +- sequence (7 bits) +每秒下的并发序列,7 bits可支持每秒128个并发,超出128则等待下一秒 + +默认参数下,初始id长度为12,最终随时间增加,最长到16位 Quick Start ------------ -Here we have a demo with 4 steps to introduce how to integrate UidGenerator into Spring based projects.
- -### Step 1: Install Java8, Maven, MySQL -If you have already installed maven, jdk8+ and Mysql or other DB which supported by Mybatis, just skip to next.
-Download [Java8](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html), -[MySQL](https://dev.mysql.com/downloads/mysql/) and [Maven](https://maven.apache.org/download.cgi), -and install jdk, mysql. For maven, extracting and setting MAVEN_HOME is enough. -#### Set JAVA_HOME & MAVEN_HOME -Here is a sample script to set JAVA_HOME and MAVEN_HOME -```shell -export MAVEN_HOME=/xxx/xxx/software/maven/apache-maven-3.3.9 -export PATH=$MAVEN_HOME/bin:$PATH -JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk/Contents/Home"; -export JAVA_HOME; -``` +这里介绍如何在SpringBoot项目中使用uid-generator-spring-boot-starter, 具体流程如下:
-### Step 2: Create table WORKER_NODE -Replace ```xxxxx``` with real database name, and run following script to create table, +### 步骤1: 创建表WORKER_NODE +在项目数据库里,运行sql脚本以导入表WORKER_NODE, 脚本如下: ```sql DROP DATABASE IF EXISTS `xxxx`; CREATE DATABASE `xxxx` ; @@ -106,7 +33,7 @@ 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: ACTUAL or CONTAINER', +TYPE INT NOT NULL COMMENT 'node type: CONTAINER(1), ACTUAL(2), FAKE(3)', LAUNCH_DATE DATE NOT NULL COMMENT 'launch date', MODIFIED TIMESTAMP NOT NULL COMMENT 'modified time', CREATED TIMESTAMP NOT NULL COMMENT 'created time', @@ -114,184 +41,64 @@ PRIMARY KEY(ID) ) COMMENT='DB WorkerID Assigner for UID Generator',ENGINE = INNODB; ``` +配置好数据库连接 -Reset property of 'jdbc.url', 'jdbc.username' and 'jdbc.password' in [mysql.properties](src/test/resources/uid/mysql.properties). - -### Step 3: Spring configuration -#### DefaultUidGenerator -There are two implements of UidGenerator: [DefaultUidGenerator](src/main/java/com/baidu/fsg/uid/impl/DefaultUidGenerator.java), [CachedUidGenerator](src/main/java/com/baidu/fsg/uid/impl/CachedUidGenerator.java).
-For performance sensitive application, CachedUidGenerator is recommended. - +### 步骤2: Maven引用 +当前项目打包,或从Maven仓库中引入uid-generator-spring-boot-starter包 ```xml - - - - - - - - - - - - - - + + com.github.wujun234 + uid-generator-spring-boot-starter + 1.0.1.RELEASE + ``` +### 步骤3: 开始使用 -#### CachedUidGenerator -Copy beans of CachedUidGenerator to 'test/resources/uid/cached-uid-spring.xml'. -```xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -``` - -#### Mybatis config -[mybatis-spring.xml](src/test/resources/uid/mybatis-spring.xml) shows as below: -```xml - - - - - - - - - - - - - - +UidGenerator接口提供了 UID 生成和解析的方法,提供了两种实现: +- [DefaultUidGenerator](src/main/java/com/github/wujun234/uid/impl/DefaultUidGenerator.java) +实时生成 +- [CachedUidGenerator](src/main/java/com/github/wujun234/uid/impl/CachedUidGenerator.java) +生成一次id之后,按序列号+1生成一批id,缓存,供之后请求 - - - - - - +如对UID生成性能有要求, 请使用CachedUidGenerator - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -``` - -### Step 4: Run UnitTest -Run [CachedUidGeneratorTest](src/test/java/com/baidu/fsg/uid/CachedUidGeneratorTest.java), shows how to generate / parse UniqueID: ```java +//@Resource +//private UidGenerator defaultUidGenerator; + @Resource -private UidGenerator uidGenerator; +private UidGenerator cachedUidGenerator; @Test public void testSerialGenerate() { // Generate UID - long uid = uidGenerator.getUID(); + long uid = cachedUidGenerator.getUID(); // Parse UID into [Timestamp, WorkerId, Sequence] - // {"UID":"180363646902239241","parsed":{ "timestamp":"2017-01-19 12:15:46", "workerId":"4", "sequence":"9" }} - System.out.println(uidGenerator.parseUID(uid)); + // {"UID":"450795408770","timestamp":"2019-02-20 14:55:39","workerId":"27","sequence":"2"} + System.out.println(cachedUidGenerator.parseUID(uid)); } ``` - -### Tips -For low concurrency and long term application, less ```seqBits``` but more ```timeBits``` is recommended. For -example, if DisposableWorkerIdAssigner is adopted and the average reboot frequency is 12 per node per day, with the -configuration ```{"workerBits":23,"timeBits":31,"seqBits":9}```, one project can run for 68 years with 28 nodes -and entirely concurrency 14400 UID/s. - -For frequent reboot and long term application, less ```seqBits``` but more ```timeBits``` and ```workerBits``` is -recommended. For example, if DisposableWorkerIdAssigner is adopted and the average reboot frequency is 24 * 12 per node -per day, with the configuration ```{"workerBits":27,"timeBits":30,"seqBits":6}```, one project can run for 34 years -with 37 nodes and entirely concurrency 2400 UID/s. - -#### Experiment for Throughput -To figure out CachedUidGenerator's UID throughput, some experiments are carried out.
-Firstly, workerBits is arbitrarily fixed to 20, and change timeBits from 25(about 1 year) to 32(about 136 years),
- -|timeBits|25|26|27|28|29|30|31|32| -|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:| -|throughput|6,831,465|7,007,279|6,679,625|6,499,205|6,534,971|7,617,440|6,186,930|6,364,997| - -![throughput1](doc/throughput1.png) - -Then, timeBits is arbitrarily fixed to 31, and workerBits is changed from 20(about 1 million total reboots) to 29(about - 500 million total reboots),
- -|workerBits|20|21|22|23|24|25|26|27|28|29| -|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:| -|throughput|6,186,930|6,642,727|6,581,661|6,462,726|6,774,609|6,414,906|6,806,266|6,223,617|6,438,055|6,435,549| - -![throughput2](doc/throughput2.png) - -It is obvious that whatever the configuration is, CachedUidGenerator always has the ability to provide **6 million** -stable throughput, what sacrificed is just life expectancy, this is very cool. - -Finally, both timeBits and workerBits are fixed to 31 and 23 separately, and change the number of CachedUidGenerator -consumer. Since our CPU only has 4 cores, \[1, 8\] is chosen.
- -|consumers|1|2|3|4|5|6|7|8| -|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:| -|throughput|6,462,726|6,542,259|6,077,717|6,377,958|7,002,410|6,599,113|7,360,934|6,490,969| - -![throughput3](doc/throughput3.png) +### 步骤4: 可选设置 +#### 自定义配置 +以下为可选配置, 如未指定将采用默认值 +```yml +uid: + timeBits: 30 # 时间位, 默认:30 + workerBits: 16 # 机器位, 默认:16 + seqBits: 7 # 序列号, 默认:7 + epochStr: "2019-02-20" # 初始时间, 默认:"2019-02-20" + enableBackward: true # 是否容忍时钟回拨, 默认:true + maxBackwardSeconds: 1 # 时钟回拨最长容忍时间(秒), 默认:1 + CachedUidGenerator: # CachedUidGenerator相关参数 + boostPower: 3 # RingBuffer size扩容参数, 可提高UID生成的吞吐量, 默认:3 + paddingFactor: 50 # 指定何时向RingBuffer中填充UID, 取值为百分比(0, 100), 默认为50 + #scheduleInterval: 60 # 默认:不配置此项, 即不实用Schedule线程. 如需使用, 请指定Schedule线程时间间隔, 单位:秒 +``` +#### 可选实现 +选用CachedUidGenerator时,可以选择实现“拒绝策略”的拓展 +- 拒绝策略: 当环已满, 无法继续填充时 +默认无需指定, 将丢弃Put操作, 仅日志记录. 如有特殊需求, 请实现RejectedPutBufferHandler接口(支持Lambda表达式) +- 拒绝策略: 当环已空, 无法继续获取时 +默认无需指定, 将记录日志, 并抛出UidGenerateException异常. 如有特殊需求, 请实现RejectedTakeBufferHandler接口(支持Lambda表达式) \ No newline at end of file diff --git a/README.zh_cn.md b/README.zh_cn.md deleted file mode 100644 index 8200c46..0000000 --- a/README.zh_cn.md +++ /dev/null @@ -1,278 +0,0 @@ -UidGenerator -========================== -[In English](README.md) - -UidGenerator是Java实现的, 基于[Snowflake](https://github.com/twitter/snowflake)算法的唯一ID生成器。UidGenerator以组件形式工作在应用项目中, -支持自定义workerId位数和初始化策略, 从而适用于[docker](https://www.docker.com/)等虚拟化环境下实例自动重启、漂移等场景。 -在实现上, UidGenerator通过借用未来时间来解决sequence天然存在的并发限制; 采用RingBuffer来缓存已生成的UID, 并行化UID的生产和消费, -同时对CacheLine补齐,避免了由RingBuffer带来的硬件级「伪共享」问题. 最终单机QPS可达600万。 - -依赖版本:[Java8](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)及以上版本, -[MySQL](https://dev.mysql.com/downloads/mysql/)(内置WorkerID分配器, 启动阶段通过DB进行分配; 如自定义实现, 则DB非必选依赖) - -Snowflake算法 -------------- -![Snowflake](doc/snowflake.png) -Snowflake算法描述:指定机器 & 同一时刻 & 某一并发序列,是唯一的。据此可生成一个64 bits的唯一ID(long)。默认采用上图字节分配方式: - -* sign(1bit) - 固定1bit符号标识,即生成的UID为正数。 - -* delta seconds (28 bits) - 当前时间,相对于时间基点"2016-05-20"的增量值,单位:秒,最多可支持约8.7年 - -* worker id (22 bits) - 机器id,最多可支持约420w次机器启动。内置实现为在启动时由数据库分配,默认分配策略为用后即弃,后续可提供复用策略。 - -* sequence (13 bits) - 每秒下的并发序列,13 bits可支持每秒8192个并发。 - -**以上参数均可通过Spring进行自定义** - - -CachedUidGenerator -------------------- -RingBuffer环形数组,数组每个元素成为一个slot。RingBuffer容量,默认为Snowflake算法中sequence最大值,且为2^N。可通过```boostPower```配置进行扩容,以提高RingBuffer -读写吞吐量。 - -Tail指针、Cursor指针用于环形数组上读写slot: - -* Tail指针 - 表示Producer生产的最大序号(此序号从0开始,持续递增)。Tail不能超过Cursor,即生产者不能覆盖未消费的slot。当Tail已赶上curosr,此时可通过```rejectedPutBufferHandler```指定PutRejectPolicy - -* Cursor指针 - 表示Consumer消费到的最小序号(序号序列与Producer序列相同)。Cursor不能超过Tail,即不能消费未生产的slot。当Cursor已赶上tail,此时可通过```rejectedTakeBufferHandler```指定TakeRejectPolicy - -![RingBuffer](doc/ringbuffer.png) - -CachedUidGenerator采用了双RingBuffer,Uid-RingBuffer用于存储Uid、Flag-RingBuffer用于存储Uid状态(是否可填充、是否可消费) - -由于数组元素在内存中是连续分配的,可最大程度利用CPU cache以提升性能。但同时会带来「伪共享」FalseSharing问题,为此在Tail、Cursor指针、Flag-RingBuffer中采用了CacheLine -补齐方式。 - -![FalseSharing](doc/cacheline_padding.png) - -#### RingBuffer填充时机 #### -* 初始化预填充 - RingBuffer初始化时,预先填充满整个RingBuffer. - -* 即时填充 - Take消费时,即时检查剩余可用slot量(```tail``` - ```cursor```),如小于设定阈值,则补全空闲slots。阈值可通过```paddingFactor```来进行配置,请参考Quick Start中CachedUidGenerator配置 - -* 周期填充 - 通过Schedule线程,定时补全空闲slots。可通过```scheduleInterval```配置,以应用定时填充功能,并指定Schedule时间间隔 - - -Quick Start ------------- - -这里介绍如何在基于Spring的项目中使用UidGenerator, 具体流程如下:
- -### 步骤1: 安装依赖 -先下载[Java8](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html), [MySQL](https://dev.mysql.com/downloads/mysql/)和[Maven](https://maven.apache.org/download.cgi) - -#### 设置环境变量 -maven无须安装, 设置好MAVEN_HOME即可. 可像下述脚本这样设置JAVA_HOME和MAVEN_HOME, 如已设置请忽略. -```shell -export MAVEN_HOME=/xxx/xxx/software/maven/apache-maven-3.3.9 -export PATH=$MAVEN_HOME/bin:$PATH -JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk/Contents/Home"; -export JAVA_HOME; -``` - -### 步骤2: 创建表WORKER_NODE -运行sql脚本以导入表WORKER_NODE, 脚本如下: -```sql -DROP DATABASE IF EXISTS `xxxx`; -CREATE DATABASE `xxxx` ; -use `xxxx`; -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: ACTUAL or CONTAINER', -LAUNCH_DATE DATE NOT NULL COMMENT 'launch date', -MODIFIED TIMESTAMP NOT NULL COMMENT 'modified time', -CREATED TIMESTAMP NOT NULL COMMENT 'created time', -PRIMARY KEY(ID) -) - COMMENT='DB WorkerID Assigner for UID Generator',ENGINE = INNODB; -``` - -修改[mysql.properties](src/test/resources/uid/mysql.properties)配置中, jdbc.url, jdbc.username和jdbc.password, 确保库地址, 名称, 端口号, 用户名和密码正确. - -### 步骤3: 修改Spring配置 -提供了两种生成器: [DefaultUidGenerator](src/main/java/com/baidu/fsg/uid/impl/DefaultUidGenerator.java)、[CachedUidGenerator](src/main/java/com/baidu/fsg/uid/impl/CachedUidGenerator.java)。如对UID生成性能有要求, 请使用CachedUidGenerator
-对应Spring配置分别为: [default-uid-spring.xml](src/test/resources/uid/default-uid-spring.xml)、[cached-uid-spring.xml](src/test/resources/uid/cached-uid-spring.xml) - -#### DefaultUidGenerator配置 -```xml - - - - - - - - - - - - - - -``` - -#### CachedUidGenerator配置 -```xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -``` - -#### Mybatis配置 -[mybatis-spring.xml](src/test/resources/uid/mybatis-spring.xml)配置说明如下: - -```xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -``` - -### 步骤4: 运行示例单测 -运行单测[CachedUidGeneratorTest](src/test/java/com/baidu/fsg/uid/CachedUidGeneratorTest.java), 展示UID生成、解析等功能 -```java -@Resource -private UidGenerator uidGenerator; - -@Test -public void testSerialGenerate() { - // Generate UID - long uid = uidGenerator.getUID(); - - // Parse UID into [Timestamp, WorkerId, Sequence] - // {"UID":"180363646902239241","parsed":{ "timestamp":"2017-01-19 12:15:46", "workerId":"4", "sequence":"9" }} - System.out.println(uidGenerator.parseUID(uid)); - -} -``` - -### 关于UID比特分配的建议 -对于并发数要求不高、期望长期使用的应用, 可增加```timeBits```位数, 减少```seqBits```位数. 例如节点采取用完即弃的WorkerIdAssigner策略, 重启频率为12次/天, -那么配置成```{"workerBits":23,"timeBits":31,"seqBits":9}```时, 可支持28个节点以整体并发量14400 UID/s的速度持续运行68年. - -对于节点重启频率频繁、期望长期使用的应用, 可增加```workerBits```和```timeBits```位数, 减少```seqBits```位数. 例如节点采取用完即弃的WorkerIdAssigner策略, 重启频率为24*12次/天, -那么配置成```{"workerBits":27,"timeBits":30,"seqBits":6}```时, 可支持37个节点以整体并发量2400 UID/s的速度持续运行34年. - -#### 吞吐量测试 -在MacBook Pro(2.7GHz Intel Core i5, 8G DDR3)上进行了CachedUidGenerator(单实例)的UID吞吐量测试.
-首先固定住workerBits为任选一个值(如20), 分别统计timeBits变化时(如从25至32, 总时长分别对应1年和136年)的吞吐量, 如下表所示:
- -|timeBits|25|26|27|28|29|30|31|32| -|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:| -|throughput|6,831,465|7,007,279|6,679,625|6,499,205|6,534,971|7,617,440|6,186,930|6,364,997| - -![throughput1](doc/throughput1.png) - -再固定住timeBits为任选一个值(如31), 分别统计workerBits变化时(如从20至29, 总重启次数分别对应1百万和500百万)的吞吐量, 如下表所示:
- -|workerBits|20|21|22|23|24|25|26|27|28|29| -|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:| -|throughput|6,186,930|6,642,727|6,581,661|6,462,726|6,774,609|6,414,906|6,806,266|6,223,617|6,438,055|6,435,549| - -![throughput1](doc/throughput2.png) - -由此可见, 不管如何配置, CachedUidGenerator总能提供**600万/s**的稳定吞吐量, 只是使用年限会有所减少. 这真的是太棒了. - -最后, 固定住workerBits和timeBits位数(如23和31), 分别统计不同数目(如1至8,本机CPU核数为4)的UID使用者情况下的吞吐量,
- -|workerBits|1|2|3|4|5|6|7|8| -|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:| -|throughput|6,462,726|6,542,259|6,077,717|6,377,958|7,002,410|6,599,113|7,360,934|6,490,969| - -![throughput1](doc/throughput3.png) \ No newline at end of file diff --git a/doc/cacheline_padding.png b/doc/cacheline_padding.png deleted file mode 100644 index ed921c96f698e264732211ab57759e9afbe17aa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135026 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 Wr@eC3W&#ENQIJuUelKMj@P7a+x)kI9 diff --git a/doc/snowflake.png b/doc/snowflake.png deleted file mode 100644 index d9d089062238ff26f88754b71ebe85b69d2a23fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16411 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 diff --git a/doc/throughput1.png b/doc/throughput1.png deleted file mode 100644 index 41c7cfd15ee1f5600147ec9dab7643cc9c954f67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56371 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 H{oDTmJOwm& diff --git a/doc/throughput2.png b/doc/throughput2.png deleted file mode 100644 index 2e89c1350932ee36b77c2bfab4b1fc84c8835dc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53327 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 bzts5r7*kv~a{TFMz{}~h+qaFUf`9lgCqJle diff --git a/doc/throughput3.png b/doc/throughput3.png deleted file mode 100644 index 15271354b0a7ad619d88e9ce62856bde534697ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53852 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

?_50jE0d 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 4.0.0 - UID-Generator + uid-generator-spring-boot-starter An unique id generator - com.baidu.fsg - uid-generator - 1.0.0-SNAPSHOT + com.github.wujun234 + uid-generator-spring-boot-starter + 1.0.1.RELEASE jar UTF-8 1.8 - 4.2.5.RELEASE - 1.7.7 + + + + org.springframework.boot + spring-boot-dependencies + 2.1.3.RELEASE + pom + import + + + + - - - org.springframework - spring-core - ${spring.version} - - - org.springframework - spring-beans - ${spring.version} - - - org.springframework - spring-context - ${spring.version} - + - org.springframework - spring-jdbc - ${spring.version} + org.springframework.boot + spring-boot-autoconfigure - + - org.mybatis - mybatis - 3.2.3 - - - org.mybatis - mybatis-spring - 1.2.4 + org.mybatis.spring.boot + mybatis-spring-boot-starter + 1.3.2 - - commons-collections - commons-collections - 3.2.2 - commons-lang commons-lang 2.6 - - - ch.qos.logback - logback-classic - 1.1.3 - - - org.slf4j - slf4j-api - ${slf4j-version} - - - org.slf4j - log4j-over-slf4j - ${slf4j-version} - - - junit - junit - 4.10 - test - - - org.springframework - spring-test - ${spring.version} + org.springframework.boot + spring-boot-starter-test test mysql mysql-connector-java - 5.1.18 - test - - - - com.alibaba - druid - 1.0.19 test @@ -141,6 +93,4 @@ - - \ No newline at end of file diff --git a/src/main/java/com/baidu/fsg/uid/BitsAllocator.java b/src/main/java/com/github/wujun234/uid/BitsAllocator.java similarity index 96% rename from src/main/java/com/baidu/fsg/uid/BitsAllocator.java rename to src/main/java/com/github/wujun234/uid/BitsAllocator.java index 065e7ca..a7933b3 100644 --- a/src/main/java/com/baidu/fsg/uid/BitsAllocator.java +++ b/src/main/java/com/github/wujun234/uid/BitsAllocator.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.baidu.fsg.uid; +package com.github.wujun234.uid; import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; @@ -59,7 +59,7 @@ public class BitsAllocator { public BitsAllocator(int timestampBits, int workerIdBits, int sequenceBits) { // make sure allocated 64 bits int allocateTotalBits = signBits + timestampBits + workerIdBits + sequenceBits; - Assert.isTrue(allocateTotalBits == TOTAL_BITS, "allocate not enough 64 bits"); + Assert.isTrue(allocateTotalBits <= TOTAL_BITS, "allocate larger than 64 bits"); // initialize bits this.timestampBits = timestampBits; diff --git a/src/main/java/com/github/wujun234/uid/UidAutoConfigure.java b/src/main/java/com/github/wujun234/uid/UidAutoConfigure.java new file mode 100644 index 0000000..2fc8a09 --- /dev/null +++ b/src/main/java/com/github/wujun234/uid/UidAutoConfigure.java @@ -0,0 +1,51 @@ +package com.github.wujun234.uid; + +import com.github.wujun234.uid.impl.CachedUidGenerator; +import com.github.wujun234.uid.impl.UidProperties; +import com.github.wujun234.uid.worker.DisposableWorkerIdAssigner; +import com.github.wujun234.uid.worker.WorkerIdAssigner; +import com.github.wujun234.uid.impl.DefaultUidGenerator; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; + +/** + * UID 的自动配置 + * + * @author wujun + * @date 2019.02.20 10:57 + */ +@Configuration +@ConditionalOnClass({ DefaultUidGenerator.class, CachedUidGenerator.class }) +@MapperScan({ "com.github.wujun234.uid.worker.dao" }) +@EnableConfigurationProperties(UidProperties.class) +public class UidAutoConfigure { + + @Autowired + private UidProperties uidProperties; + + @Bean + @ConditionalOnMissingBean + @Lazy + DefaultUidGenerator defaultUidGenerator() { + return new DefaultUidGenerator(uidProperties); + } + + @Bean + @ConditionalOnMissingBean + @Lazy + CachedUidGenerator cachedUidGenerator() { + return new CachedUidGenerator(uidProperties); + } + + @Bean + @ConditionalOnMissingBean + WorkerIdAssigner workerIdAssigner() { + return new DisposableWorkerIdAssigner(); + } +} diff --git a/src/main/java/com/baidu/fsg/uid/UidGenerator.java b/src/main/java/com/github/wujun234/uid/UidGenerator.java similarity index 91% rename from src/main/java/com/baidu/fsg/uid/UidGenerator.java rename to src/main/java/com/github/wujun234/uid/UidGenerator.java index 90cd7c7..382e93d 100644 --- a/src/main/java/com/baidu/fsg/uid/UidGenerator.java +++ b/src/main/java/com/github/wujun234/uid/UidGenerator.java @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.baidu.fsg.uid; +package com.github.wujun234.uid; -import com.baidu.fsg.uid.exception.UidGenerateException; +import com.github.wujun234.uid.exception.UidGenerateException; /** * Represents a unique id generator. diff --git a/src/main/java/com/baidu/fsg/uid/buffer/BufferPaddingExecutor.java b/src/main/java/com/github/wujun234/uid/buffer/BufferPaddingExecutor.java similarity index 97% rename from src/main/java/com/baidu/fsg/uid/buffer/BufferPaddingExecutor.java rename to src/main/java/com/github/wujun234/uid/buffer/BufferPaddingExecutor.java index 80c37ad..e2c7c6e 100644 --- a/src/main/java/com/baidu/fsg/uid/buffer/BufferPaddingExecutor.java +++ b/src/main/java/com/github/wujun234/uid/buffer/BufferPaddingExecutor.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.baidu.fsg.uid.buffer; +package com.github.wujun234.uid.buffer; import java.util.List; import java.util.concurrent.ExecutorService; @@ -22,13 +22,12 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; +import com.github.wujun234.uid.utils.NamingThreadFactory; +import com.github.wujun234.uid.utils.PaddedAtomicLong; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.Assert; -import com.baidu.fsg.uid.utils.NamingThreadFactory; -import com.baidu.fsg.uid.utils.PaddedAtomicLong; - /** * Represents an executor for padding {@link RingBuffer}
* There are two kinds of executors: one for scheduled padding, the other for padding immediately. diff --git a/src/main/java/com/baidu/fsg/uid/buffer/BufferedUidProvider.java b/src/main/java/com/github/wujun234/uid/buffer/BufferedUidProvider.java similarity index 96% rename from src/main/java/com/baidu/fsg/uid/buffer/BufferedUidProvider.java rename to src/main/java/com/github/wujun234/uid/buffer/BufferedUidProvider.java index 6b332cf..1e68f50 100644 --- a/src/main/java/com/baidu/fsg/uid/buffer/BufferedUidProvider.java +++ b/src/main/java/com/github/wujun234/uid/buffer/BufferedUidProvider.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.baidu.fsg.uid.buffer; +package com.github.wujun234.uid.buffer; import java.util.List; diff --git a/src/main/java/com/baidu/fsg/uid/buffer/RejectedPutBufferHandler.java b/src/main/java/com/github/wujun234/uid/buffer/RejectedPutBufferHandler.java similarity index 96% rename from src/main/java/com/baidu/fsg/uid/buffer/RejectedPutBufferHandler.java rename to src/main/java/com/github/wujun234/uid/buffer/RejectedPutBufferHandler.java index c9f9d34..80aa260 100644 --- a/src/main/java/com/baidu/fsg/uid/buffer/RejectedPutBufferHandler.java +++ b/src/main/java/com/github/wujun234/uid/buffer/RejectedPutBufferHandler.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.baidu.fsg.uid.buffer; +package com.github.wujun234.uid.buffer; /** * If tail catches the cursor it means that the ring buffer is full, any more buffer put request will be rejected. diff --git a/src/main/java/com/baidu/fsg/uid/buffer/RejectedTakeBufferHandler.java b/src/main/java/com/github/wujun234/uid/buffer/RejectedTakeBufferHandler.java similarity index 96% rename from src/main/java/com/baidu/fsg/uid/buffer/RejectedTakeBufferHandler.java rename to src/main/java/com/github/wujun234/uid/buffer/RejectedTakeBufferHandler.java index 0afe679..7bbb630 100644 --- a/src/main/java/com/baidu/fsg/uid/buffer/RejectedTakeBufferHandler.java +++ b/src/main/java/com/github/wujun234/uid/buffer/RejectedTakeBufferHandler.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.baidu.fsg.uid.buffer; +package com.github.wujun234.uid.buffer; /** * If cursor catches the tail it means that the ring buffer is empty, any more buffer take request will be rejected. diff --git a/src/main/java/com/baidu/fsg/uid/buffer/RingBuffer.java b/src/main/java/com/github/wujun234/uid/buffer/RingBuffer.java similarity index 99% rename from src/main/java/com/baidu/fsg/uid/buffer/RingBuffer.java rename to src/main/java/com/github/wujun234/uid/buffer/RingBuffer.java index 2b5ab62..b04141e 100644 --- a/src/main/java/com/baidu/fsg/uid/buffer/RingBuffer.java +++ b/src/main/java/com/github/wujun234/uid/buffer/RingBuffer.java @@ -13,16 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.baidu.fsg.uid.buffer; +package com.github.wujun234.uid.buffer; import java.util.concurrent.atomic.AtomicLong; +import com.github.wujun234.uid.utils.PaddedAtomicLong; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.Assert; -import com.baidu.fsg.uid.utils.PaddedAtomicLong; - /** * Represents a ring buffer based on array.
* Using array could improve read element performance due to the CUP cache line. To prevent diff --git a/src/main/java/com/baidu/fsg/uid/exception/UidGenerateException.java b/src/main/java/com/github/wujun234/uid/exception/UidGenerateException.java similarity index 97% rename from src/main/java/com/baidu/fsg/uid/exception/UidGenerateException.java rename to src/main/java/com/github/wujun234/uid/exception/UidGenerateException.java index ae7aaff..8fe67f1 100644 --- a/src/main/java/com/baidu/fsg/uid/exception/UidGenerateException.java +++ b/src/main/java/com/github/wujun234/uid/exception/UidGenerateException.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.baidu.fsg.uid.exception; +package com.github.wujun234.uid.exception; /** * UidGenerateException diff --git a/src/main/java/com/baidu/fsg/uid/impl/CachedUidGenerator.java b/src/main/java/com/github/wujun234/uid/impl/CachedUidGenerator.java similarity index 67% rename from src/main/java/com/baidu/fsg/uid/impl/CachedUidGenerator.java rename to src/main/java/com/github/wujun234/uid/impl/CachedUidGenerator.java index 4f9689c..891b411 100644 --- a/src/main/java/com/baidu/fsg/uid/impl/CachedUidGenerator.java +++ b/src/main/java/com/github/wujun234/uid/impl/CachedUidGenerator.java @@ -13,67 +13,98 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.baidu.fsg.uid.impl; +package com.github.wujun234.uid.impl; import java.util.ArrayList; import java.util.List; +import com.github.wujun234.uid.BitsAllocator; +import com.github.wujun234.uid.UidGenerator; +import com.github.wujun234.uid.exception.UidGenerateException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.util.Assert; -import com.baidu.fsg.uid.BitsAllocator; -import com.baidu.fsg.uid.UidGenerator; -import com.baidu.fsg.uid.buffer.BufferPaddingExecutor; -import com.baidu.fsg.uid.buffer.RejectedPutBufferHandler; -import com.baidu.fsg.uid.buffer.RejectedTakeBufferHandler; -import com.baidu.fsg.uid.buffer.RingBuffer; -import com.baidu.fsg.uid.exception.UidGenerateException; +import com.github.wujun234.uid.buffer.BufferPaddingExecutor; +import com.github.wujun234.uid.buffer.RejectedPutBufferHandler; +import com.github.wujun234.uid.buffer.RejectedTakeBufferHandler; +import com.github.wujun234.uid.buffer.RingBuffer; /** * Represents a cached implementation of {@link UidGenerator} extends * from {@link DefaultUidGenerator}, based on a lock free {@link RingBuffer}

- * + *

* The spring properties you can specified as below:
- *

  • boostPower: RingBuffer size boost for a power of 2, Sample: boostPower is 3, it means the buffer size - * will be ({@link BitsAllocator#getMaxSequence()} + 1) << - * {@link #boostPower}, Default as {@value #DEFAULT_BOOST_POWER} - *
  • paddingFactor: Represents a percent value of (0 - 100). When the count of rest available UIDs reach the - * threshold, it will trigger padding buffer. Default as{@link RingBuffer#DEFAULT_PADDING_PERCENT} - * Sample: paddingFactor=20, bufferSize=1000 -> threshold=1000 * 20 /100, padding buffer will be triggered when tail-cursorboostPower: RingBuffer size boost for a power of 2, Sample: boostPower is 3, it means the buffer size + * will be ({@link BitsAllocator#getMaxSequence()} + 1) << + * {@link #boostPower}, Default as {@value #DEFAULT_BOOST_POWER} + *
  • paddingFactor: Represents a percent value of (0 - 100). When the count of rest available UIDs reach the + * threshold, it will trigger padding buffer. Default as{@link RingBuffer#DEFAULT_PADDING_PERCENT} + * Sample: paddingFactor=20, bufferSize=1000 -> threshold=1000 * 20 /100, padding buffer will be triggered when tail-cursorscheduleInterval: Padding buffer in a schedule, specify padding buffer interval, Unit as second *
  • rejectedPutBufferHandler: Policy for rejected put buffer. Default as discard put request, just do logging *
  • rejectedTakeBufferHandler: Policy for rejected take buffer. Default as throwing up an exception - * + * * @author yutianbao + * @author wujun */ +@ConfigurationProperties(prefix = "uid.cached-uid-generator") public class CachedUidGenerator extends DefaultUidGenerator implements DisposableBean { private static final Logger LOGGER = LoggerFactory.getLogger(CachedUidGenerator.class); private static final int DEFAULT_BOOST_POWER = 3; - /** Spring properties */ + // --------------------- 配置属性 begin --------------------- + /** + * RingBuffer size扩容参数, 可提高UID生成的吞吐量. + * 默认:3, 原bufferSize=8192, 扩容后bufferSize= 8192 << 3 = 65536 + */ private int boostPower = DEFAULT_BOOST_POWER; + /** + * 指定何时向RingBuffer中填充UID, 取值为百分比(0, 100), 默认为50 + * 举例: bufferSize=1024, paddingFactor=50 -> threshold=1024 * 50 / 100 = 512. + * 当环上可用UID数量 < 512时, 将自动对RingBuffer进行填充补全 + */ private int paddingFactor = RingBuffer.DEFAULT_PADDING_PERCENT; + /** + * 另外一种RingBuffer填充时机, 在Schedule线程中, 周期性检查填充 + * 默认:不配置此项, 即不使用Schedule线程. 如需使用, 请指定Schedule线程时间间隔, 单位:秒 + */ private Long scheduleInterval; - + // --------------------- 配置属性 end ----------------------- + + /** 拒绝策略: 当环已满, 无法继续填充时 + 默认无需指定, 将丢弃Put操作, 仅日志记录. 如有特殊需求, 请实现RejectedPutBufferHandler接口(支持Lambda表达式)并以@Autowired方式注入 */ + @Autowired(required = false) private RejectedPutBufferHandler rejectedPutBufferHandler; + + /** 拒绝策略: 当环已空, 无法继续获取时 + 默认无需指定, 将记录日志, 并抛出UidGenerateException异常. 如有特殊需求, 请实现RejectedTakeBufferHandler接口(支持Lambda表达式)并以@Autowired方式注入 */ + @Autowired(required = false) private RejectedTakeBufferHandler rejectedTakeBufferHandler; - /** RingBuffer */ + /** + * RingBuffer + */ private RingBuffer ringBuffer; private BufferPaddingExecutor bufferPaddingExecutor; + public CachedUidGenerator(UidProperties uidProperties) { + super(uidProperties); + } + @Override public void afterPropertiesSet() throws Exception { // initialize workerId & bitsAllocator super.afterPropertiesSet(); - + // initialize RingBuffer & RingBufferPaddingExecutor this.initRingBuffer(); LOGGER.info("Initialized RingBuffer successfully."); } - + @Override public long getUID() { try { @@ -88,7 +119,7 @@ public long getUID() { public String parseUID(long uid) { return super.parseUID(uid); } - + @Override public void destroy() throws Exception { bufferPaddingExecutor.shutdown(); @@ -96,7 +127,7 @@ public void destroy() throws Exception { /** * Get the UIDs in the same specified second under the max sequence - * + * * @param currentSecond * @return UID list, size of {@link BitsAllocator#getMaxSequence()} + 1 */ @@ -106,14 +137,14 @@ protected List nextIdsForOneSecond(long currentSecond) { List uidList = new ArrayList<>(listSize); // Allocate the first sequence of the second, the others can be calculated with the offset - long firstSeqUid = bitsAllocator.allocate(currentSecond - epochSeconds, workerId, 0L); + long firstSeqUid = bitsAllocator.allocate(currentSecond - uidProperties.getEpochSeconds(), workerId, 0L); for (int offset = 0; offset < listSize; offset++) { uidList.add(firstSeqUid + offset); } return uidList; } - + /** * Initialize RingBuffer & RingBufferPaddingExecutor */ @@ -129,9 +160,9 @@ private void initRingBuffer() { if (usingSchedule) { bufferPaddingExecutor.setScheduleInterval(scheduleInterval); } - + LOGGER.info("Initialized BufferPaddingExecutor. Using schdule:{}, interval:{}", usingSchedule, scheduleInterval); - + // set rejected put/take handle policy this.ringBuffer.setBufferPaddingExecutor(bufferPaddingExecutor); if (rejectedPutBufferHandler != null) { @@ -140,10 +171,10 @@ private void initRingBuffer() { if (rejectedTakeBufferHandler != null) { this.ringBuffer.setRejectedTakeHandler(rejectedTakeBufferHandler); } - + // fill in all slots of the RingBuffer bufferPaddingExecutor.paddingBuffer(); - + // start buffer padding threads bufferPaddingExecutor.start(); } @@ -155,7 +186,12 @@ public void setBoostPower(int boostPower) { Assert.isTrue(boostPower > 0, "Boost power must be positive!"); this.boostPower = boostPower; } - + + public void setPaddingFactor(int paddingFactor) { + Assert.isTrue(paddingFactor > 0 && paddingFactor < 100, "padding factor must be in (0, 100)!"); + this.paddingFactor = paddingFactor; + } + public void setRejectedPutBufferHandler(RejectedPutBufferHandler rejectedPutBufferHandler) { Assert.notNull(rejectedPutBufferHandler, "RejectedPutBufferHandler can't be null!"); this.rejectedPutBufferHandler = rejectedPutBufferHandler; diff --git a/src/main/java/com/baidu/fsg/uid/impl/DefaultUidGenerator.java b/src/main/java/com/github/wujun234/uid/impl/DefaultUidGenerator.java similarity index 64% rename from src/main/java/com/baidu/fsg/uid/impl/DefaultUidGenerator.java rename to src/main/java/com/github/wujun234/uid/impl/DefaultUidGenerator.java index 20f9a2a..528dbaf 100644 --- a/src/main/java/com/baidu/fsg/uid/impl/DefaultUidGenerator.java +++ b/src/main/java/com/github/wujun234/uid/impl/DefaultUidGenerator.java @@ -13,86 +13,94 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.baidu.fsg.uid.impl; +package com.github.wujun234.uid.impl; import java.util.Date; import java.util.concurrent.TimeUnit; -import org.apache.commons.lang.StringUtils; +import com.github.wujun234.uid.BitsAllocator; +import com.github.wujun234.uid.UidGenerator; +import com.github.wujun234.uid.exception.UidGenerateException; +import com.github.wujun234.uid.impl.UidProperties; +import com.github.wujun234.uid.utils.DateUtils; +import com.github.wujun234.uid.worker.WorkerIdAssigner; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; -import com.baidu.fsg.uid.BitsAllocator; -import com.baidu.fsg.uid.UidGenerator; -import com.baidu.fsg.uid.exception.UidGenerateException; -import com.baidu.fsg.uid.utils.DateUtils; -import com.baidu.fsg.uid.worker.WorkerIdAssigner; +import org.springframework.beans.factory.annotation.Autowired; /** * Represents an implementation of {@link UidGenerator} - * + *

    * The unique id has 64bits (long), default allocated as blow:
    *

  • sign: The highest bit is 0 *
  • delta seconds: The next 28 bits, represents delta seconds since a customer epoch(2016-05-20 00:00:00.000). - * Supports about 8.7 years until to 2024-11-20 21:24:16 + * Supports about 8.7 years until to 2024-11-20 21:24:16 *
  • worker id: The next 22 bits, represents the worker's id which assigns based on database, max id is about 420W *
  • sequence: The next 13 bits, represents a sequence within the same second, max for 8192/s

    - * + *

    * The {@link DefaultUidGenerator#parseUID(long)} is a tool method to parse the bits - * + *

    *

    {@code
      * +------+----------------------+----------------+-----------+
      * | sign |     delta seconds    | worker node id | sequence  |
      * +------+----------------------+----------------+-----------+
      *   1bit          28bits              22bits         13bits
      * }
    - * + *

    * You can also specified the bits by Spring property setting. *

  • timeBits: default as 28 *
  • workerBits: default as 22 *
  • seqBits: default as 13 *
  • epochStr: Epoch date string format 'yyyy-MM-dd'. Default as '2016-05-20'

    - * + *

    * Note that: The total bits must be 64 -1 * * @author yutianbao + * @author wujun */ public class DefaultUidGenerator implements UidGenerator, InitializingBean { private static final Logger LOGGER = LoggerFactory.getLogger(DefaultUidGenerator.class); - /** Bits allocate */ - protected int timeBits = 28; - protected int workerBits = 22; - protected int seqBits = 13; - - /** Customer epoch, unit as second. For example 2016-05-20 (ms: 1463673600000)*/ - protected String epochStr = "2016-05-20"; - protected long epochSeconds = TimeUnit.MILLISECONDS.toSeconds(1463673600000L); + protected UidProperties uidProperties; - /** Stable fields after spring bean initializing */ + /** + * Bit分配器,Stable fields after spring bean initializing + */ protected BitsAllocator bitsAllocator; protected long workerId; - /** Volatile fields caused by nextId() */ + /** + * Volatile fields caused by nextId() + */ protected long sequence = 0L; protected long lastSecond = -1L; - /** Spring property */ + /** + * Spring property + */ + @Autowired protected WorkerIdAssigner workerIdAssigner; + public DefaultUidGenerator(UidProperties uidProperties) { + this.uidProperties = uidProperties; + } + @Override public void afterPropertiesSet() throws Exception { // initialize bits allocator - bitsAllocator = new BitsAllocator(timeBits, workerBits, seqBits); + bitsAllocator = new BitsAllocator(uidProperties.getTimeBits(), uidProperties.getWorkerBits(), uidProperties.getSeqBits()); // initialize worker id workerId = workerIdAssigner.assignWorkerId(); if (workerId > bitsAllocator.getMaxWorkerId()) { - throw new RuntimeException("Worker id " + workerId + " exceeds the max " + bitsAllocator.getMaxWorkerId()); + LOGGER.error("Worker id " + workerId + " exceeds the max " + bitsAllocator.getMaxWorkerId()); + workerId = workerId % bitsAllocator.getMaxWorkerId(); + LOGGER.info("new Worker id = " + workerId); } - LOGGER.info("Initialized bits(1, {}, {}, {}) for workerID:{}", timeBits, workerBits, seqBits, workerId); + LOGGER.info("Initialized bits(1, {}, {}, {}) for workerID:{}", uidProperties.getTimeBits(), uidProperties.getWorkerBits(), uidProperties.getSeqBits(), workerId); } @Override @@ -108,17 +116,15 @@ public long getUID() throws UidGenerateException { @Override public String parseUID(long uid) { long totalBits = BitsAllocator.TOTAL_BITS; - long signBits = bitsAllocator.getSignBits(); - long timestampBits = bitsAllocator.getTimestampBits(); long workerIdBits = bitsAllocator.getWorkerIdBits(); long sequenceBits = bitsAllocator.getSequenceBits(); // parse UID long sequence = (uid << (totalBits - sequenceBits)) >>> (totalBits - sequenceBits); - long workerId = (uid << (timestampBits + signBits)) >>> (totalBits - workerIdBits); + long workerId = (uid << (totalBits - workerIdBits - sequenceBits)) >>> (totalBits - workerIdBits); long deltaSeconds = uid >>> (workerIdBits + sequenceBits); - Date thatTime = new Date(TimeUnit.SECONDS.toMillis(epochSeconds + deltaSeconds)); + Date thatTime = new Date(TimeUnit.SECONDS.toMillis(uidProperties.getEpochSeconds() + deltaSeconds)); String thatTimeStr = DateUtils.formatByDateTimePattern(thatTime); // format as string @@ -138,7 +144,24 @@ protected synchronized long nextId() { // Clock moved backwards, refuse to generate uid if (currentSecond < lastSecond) { long refusedSeconds = lastSecond - currentSecond; - throw new UidGenerateException("Clock moved backwards. Refusing for %d seconds", refusedSeconds); + if (uidProperties.isEnableBackward()) { + if (refusedSeconds <= uidProperties.getMaxBackwardSeconds()) { + LOGGER.error("Clock moved backwards. wait for %d seconds", refusedSeconds); + while (currentSecond < lastSecond) { + currentSecond = getCurrentSecond(); + } + } else { + workerId = workerIdAssigner.assignFakeWorkerId(); + LOGGER.error("Clock moved backwards. Assign New WorkerId %d", workerId); + if (workerId > bitsAllocator.getMaxWorkerId()) { + LOGGER.error("Worker id " + workerId + " exceeds the max " + bitsAllocator.getMaxWorkerId()); + workerId = workerId % bitsAllocator.getMaxWorkerId(); + LOGGER.info("new Worker id = " + workerId); + } + } + } else { + throw new UidGenerateException("Clock moved backwards. Refusing for %d seconds", refusedSeconds); + } } // At the same second, increase sequence @@ -149,7 +172,7 @@ protected synchronized long nextId() { currentSecond = getNextSecond(lastSecond); } - // At the different second, sequence restart from zero + // At the different second, sequence restart from zero } else { sequence = 0L; } @@ -157,11 +180,11 @@ protected synchronized long nextId() { lastSecond = currentSecond; // Allocate bits for UID - return bitsAllocator.allocate(currentSecond - epochSeconds, workerId, sequence); + return bitsAllocator.allocate(currentSecond - uidProperties.getEpochSeconds(), workerId, sequence); } /** - * Get next millisecond + * Get next second */ private long getNextSecond(long lastTimestamp) { long timestamp = getCurrentSecond(); @@ -177,7 +200,7 @@ private long getNextSecond(long lastTimestamp) { */ private long getCurrentSecond() { long currentSecond = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis()); - if (currentSecond - epochSeconds > bitsAllocator.getMaxDeltaSeconds()) { + if (currentSecond - uidProperties.getEpochSeconds() > bitsAllocator.getMaxDeltaSeconds()) { throw new UidGenerateException("Timestamp bits is exhausted. Refusing UID generate. Now: " + currentSecond); } @@ -190,29 +213,4 @@ private long getCurrentSecond() { public void setWorkerIdAssigner(WorkerIdAssigner workerIdAssigner) { this.workerIdAssigner = workerIdAssigner; } - - public void setTimeBits(int timeBits) { - if (timeBits > 0) { - this.timeBits = timeBits; - } - } - - public void setWorkerBits(int workerBits) { - if (workerBits > 0) { - this.workerBits = workerBits; - } - } - - public void setSeqBits(int seqBits) { - if (seqBits > 0) { - this.seqBits = seqBits; - } - } - - public void setEpochStr(String epochStr) { - if (StringUtils.isNotBlank(epochStr)) { - this.epochStr = epochStr; - this.epochSeconds = TimeUnit.MILLISECONDS.toSeconds(DateUtils.parseByDayPattern(epochStr).getTime()); - } - } } diff --git a/src/main/java/com/github/wujun234/uid/impl/UidProperties.java b/src/main/java/com/github/wujun234/uid/impl/UidProperties.java new file mode 100644 index 0000000..f002369 --- /dev/null +++ b/src/main/java/com/github/wujun234/uid/impl/UidProperties.java @@ -0,0 +1,113 @@ +package com.github.wujun234.uid.impl; + +import com.github.wujun234.uid.utils.DateUtils; +import org.apache.commons.lang.StringUtils; +import org.springframework.boot.context.properties.ConfigurationProperties; + +import java.util.concurrent.TimeUnit; + +/** + * UID 的配置 + * + * @author wujun + * @date 2019.02.20 10:31 + */ +@ConfigurationProperties(prefix = "uid") +public class UidProperties { + + /** + * 时间增量值占用位数。当前时间相对于时间基点的增量值,单位为秒 + */ + private int timeBits = 30; + + /** + * 工作机器ID占用的位数 + */ + private int workerBits = 16; + + /** + * 序列号占用的位数 + */ + private int seqBits = 7; + + /** + * 时间基点. 例如 2019-02-20 (毫秒: 1550592000000) + */ + private String epochStr = "2019-02-20"; + + /** + * 时间基点对应的毫秒数 + */ + private long epochSeconds = TimeUnit.MILLISECONDS.toSeconds(1550592000000L); + + /** + * 是否容忍时钟回拨, 默认:true + */ + private boolean enableBackward = true; + + /** + * 时钟回拨最长容忍时间(秒) + */ + private long maxBackwardSeconds = 1L; + + public int getTimeBits() { + return timeBits; + } + + public void setTimeBits(int timeBits) { + if (timeBits > 0) { + this.timeBits = timeBits; + } + } + + public int getWorkerBits() { + return workerBits; + } + + public void setWorkerBits(int workerBits) { + if (workerBits > 0) { + this.workerBits = workerBits; + } + } + + public int getSeqBits() { + return seqBits; + } + + public void setSeqBits(int seqBits) { + if (seqBits > 0) { + this.seqBits = seqBits; + } + } + + public String getEpochStr() { + return epochStr; + } + + public void setEpochStr(String epochStr) { + if (StringUtils.isNotBlank(epochStr)) { + this.epochStr = epochStr; + this.epochSeconds = TimeUnit.MILLISECONDS.toSeconds(DateUtils.parseByDayPattern(epochStr).getTime()); + } + } + + public long getEpochSeconds() { + return epochSeconds; + } + + public boolean isEnableBackward() { + return enableBackward; + } + + public void setEnableBackward(boolean enableBackward) { + this.enableBackward = enableBackward; + } + + public long getMaxBackwardSeconds() { + return maxBackwardSeconds; + } + + public void setMaxBackwardSeconds(long maxBackwardSeconds) { + this.maxBackwardSeconds = maxBackwardSeconds; + } +} diff --git a/src/main/java/com/baidu/fsg/uid/utils/DateUtils.java b/src/main/java/com/github/wujun234/uid/utils/DateUtils.java similarity index 98% rename from src/main/java/com/baidu/fsg/uid/utils/DateUtils.java rename to src/main/java/com/github/wujun234/uid/utils/DateUtils.java index e60b8cb..a5a7677 100644 --- a/src/main/java/com/baidu/fsg/uid/utils/DateUtils.java +++ b/src/main/java/com/github/wujun234/uid/utils/DateUtils.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.baidu.fsg.uid.utils; +package com.github.wujun234.uid.utils; import java.text.ParseException; import java.util.Calendar; diff --git a/src/main/java/com/baidu/fsg/uid/utils/DockerUtils.java b/src/main/java/com/github/wujun234/uid/utils/DockerUtils.java similarity index 95% rename from src/main/java/com/baidu/fsg/uid/utils/DockerUtils.java rename to src/main/java/com/github/wujun234/uid/utils/DockerUtils.java index ac0fd41..bcb155c 100644 --- a/src/main/java/com/baidu/fsg/uid/utils/DockerUtils.java +++ b/src/main/java/com/github/wujun234/uid/utils/DockerUtils.java @@ -1,104 +1,104 @@ -/* - * Copyright (c) 2017 Baidu, Inc. All Rights Reserve. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.baidu.fsg.uid.utils; - -import org.apache.commons.lang.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * DockerUtils - * - * @author yutianbao - */ -public abstract class DockerUtils { - private static final Logger LOGGER = LoggerFactory.getLogger(DockerUtils.class); - - /** Environment param keys */ - private static final String ENV_KEY_HOST = "JPAAS_HOST"; - private static final String ENV_KEY_PORT = "JPAAS_HTTP_PORT"; - private static final String ENV_KEY_PORT_ORIGINAL = "JPAAS_HOST_PORT_8080"; - - /** Docker host & port */ - private static String DOCKER_HOST = ""; - private static String DOCKER_PORT = ""; - - /** Whether is docker */ - private static boolean IS_DOCKER; - - static { - retrieveFromEnv(); - } - - /** - * Retrieve docker host - * - * @return empty string if not a docker - */ - public static String getDockerHost() { - return DOCKER_HOST; - } - - /** - * Retrieve docker port - * - * @return empty string if not a docker - */ - public static String getDockerPort() { - return DOCKER_PORT; - } - - /** - * Whether a docker - * - * @return - */ - public static boolean isDocker() { - return IS_DOCKER; - } - - /** - * Retrieve host & port from environment - */ - private static void retrieveFromEnv() { - // retrieve host & port from environment - DOCKER_HOST = System.getenv(ENV_KEY_HOST); - DOCKER_PORT = System.getenv(ENV_KEY_PORT); - - // not found from 'JPAAS_HTTP_PORT', then try to find from 'JPAAS_HOST_PORT_8080' - if (StringUtils.isBlank(DOCKER_PORT)) { - DOCKER_PORT = System.getenv(ENV_KEY_PORT_ORIGINAL); - } - - boolean hasEnvHost = StringUtils.isNotBlank(DOCKER_HOST); - boolean hasEnvPort = StringUtils.isNotBlank(DOCKER_PORT); - - // docker can find both host & port from environment - if (hasEnvHost && hasEnvPort) { - IS_DOCKER = true; - - // found nothing means not a docker, maybe an actual machine - } else if (!hasEnvHost && !hasEnvPort) { - IS_DOCKER = false; - - } else { - LOGGER.error("Missing host or port from env for Docker. host:{}, port:{}", DOCKER_HOST, DOCKER_PORT); - throw new RuntimeException( - "Missing host or port from env for Docker. host:" + DOCKER_HOST + ", port:" + DOCKER_PORT); - } - } - -} +/* + * Copyright (c) 2017 Baidu, Inc. All Rights Reserve. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.github.wujun234.uid.utils; + +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * DockerUtils + * + * @author yutianbao + */ +public abstract class DockerUtils { + private static final Logger LOGGER = LoggerFactory.getLogger(DockerUtils.class); + + /** Environment param keys */ + private static final String ENV_KEY_HOST = "JPAAS_HOST"; + private static final String ENV_KEY_PORT = "JPAAS_HTTP_PORT"; + private static final String ENV_KEY_PORT_ORIGINAL = "JPAAS_HOST_PORT_8080"; + + /** Docker host & port */ + private static String DOCKER_HOST = ""; + private static String DOCKER_PORT = ""; + + /** Whether is docker */ + private static boolean IS_DOCKER; + + static { + retrieveFromEnv(); + } + + /** + * Retrieve docker host + * + * @return empty string if not a docker + */ + public static String getDockerHost() { + return DOCKER_HOST; + } + + /** + * Retrieve docker port + * + * @return empty string if not a docker + */ + public static String getDockerPort() { + return DOCKER_PORT; + } + + /** + * Whether a docker + * + * @return + */ + public static boolean isDocker() { + return IS_DOCKER; + } + + /** + * Retrieve host & port from environment + */ + private static void retrieveFromEnv() { + // retrieve host & port from environment + DOCKER_HOST = System.getenv(ENV_KEY_HOST); + DOCKER_PORT = System.getenv(ENV_KEY_PORT); + + // not found from 'JPAAS_HTTP_PORT', then try to find from 'JPAAS_HOST_PORT_8080' + if (StringUtils.isBlank(DOCKER_PORT)) { + DOCKER_PORT = System.getenv(ENV_KEY_PORT_ORIGINAL); + } + + boolean hasEnvHost = StringUtils.isNotBlank(DOCKER_HOST); + boolean hasEnvPort = StringUtils.isNotBlank(DOCKER_PORT); + + // docker can find both host & port from environment + if (hasEnvHost && hasEnvPort) { + IS_DOCKER = true; + + // found nothing means not a docker, maybe an actual machine + } else if (!hasEnvHost && !hasEnvPort) { + IS_DOCKER = false; + + } else { + LOGGER.error("Missing host or port from env for Docker. host:{}, port:{}", DOCKER_HOST, DOCKER_PORT); + throw new RuntimeException( + "Missing host or port from env for Docker. host:" + DOCKER_HOST + ", port:" + DOCKER_PORT); + } + } + +} diff --git a/src/main/java/com/baidu/fsg/uid/utils/EnumUtils.java b/src/main/java/com/github/wujun234/uid/utils/EnumUtils.java similarity index 94% rename from src/main/java/com/baidu/fsg/uid/utils/EnumUtils.java rename to src/main/java/com/github/wujun234/uid/utils/EnumUtils.java index 0264911..c95cf07 100644 --- a/src/main/java/com/baidu/fsg/uid/utils/EnumUtils.java +++ b/src/main/java/com/github/wujun234/uid/utils/EnumUtils.java @@ -1,64 +1,64 @@ -/* - * Copyright (c) 2017 Baidu, Inc. All Rights Reserve. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.baidu.fsg.uid.utils; - -import org.springframework.util.Assert; - -/** - * EnumUtils provides the operations for {@link ValuedEnum} such as Parse, value of... - * - * @author yutianbao - */ -public abstract class EnumUtils { - - /** - * Parse the bounded value into ValuedEnum - * - * @param clz - * @param value - * @return - */ - public static , V> T parse(Class clz, V value) { - Assert.notNull(clz, "clz can not be null"); - if (value == null) { - return null; - } - - for (T t : clz.getEnumConstants()) { - if (value.equals(t.value())) { - return t; - } - } - return null; - } - - /** - * Null-safe valueOf function - * - * @param - * @param enumType - * @param name - * @return - */ - public static > T valueOf(Class enumType, String name) { - if (name == null) { - return null; - } - - return Enum.valueOf(enumType, name); - } - -} +/* + * Copyright (c) 2017 Baidu, Inc. All Rights Reserve. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.github.wujun234.uid.utils; + +import org.springframework.util.Assert; + +/** + * EnumUtils provides the operations for {@link ValuedEnum} such as Parse, value of... + * + * @author yutianbao + */ +public abstract class EnumUtils { + + /** + * Parse the bounded value into ValuedEnum + * + * @param clz + * @param value + * @return + */ + public static , V> T parse(Class clz, V value) { + Assert.notNull(clz, "clz can not be null"); + if (value == null) { + return null; + } + + for (T t : clz.getEnumConstants()) { + if (value.equals(t.value())) { + return t; + } + } + return null; + } + + /** + * Null-safe valueOf function + * + * @param + * @param enumType + * @param name + * @return + */ + public static > T valueOf(Class enumType, String name) { + if (name == null) { + return null; + } + + return Enum.valueOf(enumType, name); + } + +} diff --git a/src/main/java/com/baidu/fsg/uid/utils/NamingThreadFactory.java b/src/main/java/com/github/wujun234/uid/utils/NamingThreadFactory.java similarity index 96% rename from src/main/java/com/baidu/fsg/uid/utils/NamingThreadFactory.java rename to src/main/java/com/github/wujun234/uid/utils/NamingThreadFactory.java index 8b11a2c..43a29b3 100644 --- a/src/main/java/com/baidu/fsg/uid/utils/NamingThreadFactory.java +++ b/src/main/java/com/github/wujun234/uid/utils/NamingThreadFactory.java @@ -1,164 +1,164 @@ -/* - * Copyright (c) 2017 Baidu, Inc. All Rights Reserve. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.baidu.fsg.uid.utils; - -import java.lang.Thread.UncaughtExceptionHandler; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.atomic.AtomicLong; - -import org.apache.commons.lang.ClassUtils; -import org.apache.commons.lang.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Named thread in ThreadFactory. If there is no specified name for thread, it - * will auto detect using the invoker classname instead. - * - * @author yutianbao - */ -public class NamingThreadFactory implements ThreadFactory { - private static final Logger LOGGER = LoggerFactory.getLogger(NamingThreadFactory.class); - - /** - * Thread name pre - */ - private String name; - /** - * Is daemon thread - */ - private boolean daemon; - /** - * UncaughtExceptionHandler - */ - private UncaughtExceptionHandler uncaughtExceptionHandler; - /** - * Sequences for multi thread name prefix - */ - private final ConcurrentHashMap sequences; - - /** - * Constructors - */ - public NamingThreadFactory() { - this(null, false, null); - } - - public NamingThreadFactory(String name) { - this(name, false, null); - } - - public NamingThreadFactory(String name, boolean daemon) { - this(name, daemon, null); - } - - public NamingThreadFactory(String name, boolean daemon, UncaughtExceptionHandler handler) { - this.name = name; - this.daemon = daemon; - this.uncaughtExceptionHandler = handler; - this.sequences = new ConcurrentHashMap(); - } - - @Override - public Thread newThread(Runnable r) { - Thread thread = new Thread(r); - thread.setDaemon(this.daemon); - - // If there is no specified name for thread, it will auto detect using the invoker classname instead. - // Notice that auto detect may cause some performance overhead - String prefix = this.name; - if (StringUtils.isBlank(prefix)) { - prefix = getInvoker(2); - } - thread.setName(prefix + "-" + getSequence(prefix)); - - // no specified uncaughtExceptionHandler, just do logging. - if (this.uncaughtExceptionHandler != null) { - thread.setUncaughtExceptionHandler(this.uncaughtExceptionHandler); - } else { - thread.setUncaughtExceptionHandler(new UncaughtExceptionHandler() { - public void uncaughtException(Thread t, Throwable e) { - LOGGER.error("unhandled exception in thread: " + t.getId() + ":" + t.getName(), e); - } - }); - } - - return thread; - } - - /** - * Get the method invoker's class name - * - * @param depth - * @return - */ - private String getInvoker(int depth) { - Exception e = new Exception(); - StackTraceElement[] stes = e.getStackTrace(); - if (stes.length > depth) { - return ClassUtils.getShortClassName(stes[depth].getClassName()); - } - return getClass().getSimpleName(); - } - - /** - * Get sequence for different naming prefix - * - * @param invoker - * @return - */ - private long getSequence(String invoker) { - AtomicLong r = this.sequences.get(invoker); - if (r == null) { - r = new AtomicLong(0); - AtomicLong previous = this.sequences.putIfAbsent(invoker, r); - if (previous != null) { - r = previous; - } - } - - return r.incrementAndGet(); - } - - /** - * Getters & Setters - */ - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public boolean isDaemon() { - return daemon; - } - - public void setDaemon(boolean daemon) { - this.daemon = daemon; - } - - public UncaughtExceptionHandler getUncaughtExceptionHandler() { - return uncaughtExceptionHandler; - } - - public void setUncaughtExceptionHandler(UncaughtExceptionHandler handler) { - this.uncaughtExceptionHandler = handler; - } - -} +/* + * Copyright (c) 2017 Baidu, Inc. All Rights Reserve. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.github.wujun234.uid.utils; + +import java.lang.Thread.UncaughtExceptionHandler; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.atomic.AtomicLong; + +import org.apache.commons.lang.ClassUtils; +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Named thread in ThreadFactory. If there is no specified name for thread, it + * will auto detect using the invoker classname instead. + * + * @author yutianbao + */ +public class NamingThreadFactory implements ThreadFactory { + private static final Logger LOGGER = LoggerFactory.getLogger(NamingThreadFactory.class); + + /** + * Thread name pre + */ + private String name; + /** + * Is daemon thread + */ + private boolean daemon; + /** + * UncaughtExceptionHandler + */ + private UncaughtExceptionHandler uncaughtExceptionHandler; + /** + * Sequences for multi thread name prefix + */ + private final ConcurrentHashMap sequences; + + /** + * Constructors + */ + public NamingThreadFactory() { + this(null, false, null); + } + + public NamingThreadFactory(String name) { + this(name, false, null); + } + + public NamingThreadFactory(String name, boolean daemon) { + this(name, daemon, null); + } + + public NamingThreadFactory(String name, boolean daemon, UncaughtExceptionHandler handler) { + this.name = name; + this.daemon = daemon; + this.uncaughtExceptionHandler = handler; + this.sequences = new ConcurrentHashMap(); + } + + @Override + public Thread newThread(Runnable r) { + Thread thread = new Thread(r); + thread.setDaemon(this.daemon); + + // If there is no specified name for thread, it will auto detect using the invoker classname instead. + // Notice that auto detect may cause some performance overhead + String prefix = this.name; + if (StringUtils.isBlank(prefix)) { + prefix = getInvoker(2); + } + thread.setName(prefix + "-" + getSequence(prefix)); + + // no specified uncaughtExceptionHandler, just do logging. + if (this.uncaughtExceptionHandler != null) { + thread.setUncaughtExceptionHandler(this.uncaughtExceptionHandler); + } else { + thread.setUncaughtExceptionHandler(new UncaughtExceptionHandler() { + public void uncaughtException(Thread t, Throwable e) { + LOGGER.error("unhandled exception in thread: " + t.getId() + ":" + t.getName(), e); + } + }); + } + + return thread; + } + + /** + * Get the method invoker's class name + * + * @param depth + * @return + */ + private String getInvoker(int depth) { + Exception e = new Exception(); + StackTraceElement[] stes = e.getStackTrace(); + if (stes.length > depth) { + return ClassUtils.getShortClassName(stes[depth].getClassName()); + } + return getClass().getSimpleName(); + } + + /** + * Get sequence for different naming prefix + * + * @param invoker + * @return + */ + private long getSequence(String invoker) { + AtomicLong r = this.sequences.get(invoker); + if (r == null) { + r = new AtomicLong(0); + AtomicLong previous = this.sequences.putIfAbsent(invoker, r); + if (previous != null) { + r = previous; + } + } + + return r.incrementAndGet(); + } + + /** + * Getters & Setters + */ + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public boolean isDaemon() { + return daemon; + } + + public void setDaemon(boolean daemon) { + this.daemon = daemon; + } + + public UncaughtExceptionHandler getUncaughtExceptionHandler() { + return uncaughtExceptionHandler; + } + + public void setUncaughtExceptionHandler(UncaughtExceptionHandler handler) { + this.uncaughtExceptionHandler = handler; + } + +} diff --git a/src/main/java/com/baidu/fsg/uid/utils/NetUtils.java b/src/main/java/com/github/wujun234/uid/utils/NetUtils.java similarity index 95% rename from src/main/java/com/baidu/fsg/uid/utils/NetUtils.java rename to src/main/java/com/github/wujun234/uid/utils/NetUtils.java index d74aadd..311d36f 100644 --- a/src/main/java/com/baidu/fsg/uid/utils/NetUtils.java +++ b/src/main/java/com/github/wujun234/uid/utils/NetUtils.java @@ -1,84 +1,84 @@ -/* - * Copyright (c) 2017 Baidu, Inc. All Rights Reserve. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.baidu.fsg.uid.utils; - -import java.net.InetAddress; -import java.net.NetworkInterface; -import java.net.SocketException; -import java.util.Enumeration; - -/** - * NetUtils - * - * @author yutianbao - */ -public abstract class NetUtils { - - /** - * Pre-loaded local address - */ - public static InetAddress localAddress; - - static { - try { - localAddress = getLocalInetAddress(); - } catch (SocketException e) { - throw new RuntimeException("fail to get local ip."); - } - } - - /** - * Retrieve the first validated local ip address(the Public and LAN ip addresses are validated). - * - * @return the local address - * @throws SocketException the socket exception - */ - public static InetAddress getLocalInetAddress() throws SocketException { - // enumerates all network interfaces - Enumeration enu = NetworkInterface.getNetworkInterfaces(); - - while (enu.hasMoreElements()) { - NetworkInterface ni = enu.nextElement(); - if (ni.isLoopback()) { - continue; - } - - Enumeration addressEnumeration = ni.getInetAddresses(); - while (addressEnumeration.hasMoreElements()) { - InetAddress address = addressEnumeration.nextElement(); - - // ignores all invalidated addresses - if (address.isLinkLocalAddress() || address.isLoopbackAddress() || address.isAnyLocalAddress()) { - continue; - } - - return address; - } - } - - throw new RuntimeException("No validated local address!"); - } - - /** - * Retrieve local address - * - * @return the string local address - */ - public static String getLocalAddress() { - return localAddress.getHostAddress(); - } - -} +/* + * Copyright (c) 2017 Baidu, Inc. All Rights Reserve. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.github.wujun234.uid.utils; + +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.util.Enumeration; + +/** + * NetUtils + * + * @author yutianbao + */ +public abstract class NetUtils { + + /** + * Pre-loaded local address + */ + public static InetAddress localAddress; + + static { + try { + localAddress = getLocalInetAddress(); + } catch (SocketException e) { + throw new RuntimeException("fail to get local ip."); + } + } + + /** + * Retrieve the first validated local ip address(the Public and LAN ip addresses are validated). + * + * @return the local address + * @throws SocketException the socket exception + */ + public static InetAddress getLocalInetAddress() throws SocketException { + // enumerates all network interfaces + Enumeration enu = NetworkInterface.getNetworkInterfaces(); + + while (enu.hasMoreElements()) { + NetworkInterface ni = enu.nextElement(); + if (ni.isLoopback()) { + continue; + } + + Enumeration addressEnumeration = ni.getInetAddresses(); + while (addressEnumeration.hasMoreElements()) { + InetAddress address = addressEnumeration.nextElement(); + + // ignores all invalidated addresses + if (address.isLinkLocalAddress() || address.isLoopbackAddress() || address.isAnyLocalAddress()) { + continue; + } + + return address; + } + } + + throw new RuntimeException("No validated local address!"); + } + + /** + * Retrieve local address + * + * @return the string local address + */ + public static String getLocalAddress() { + return localAddress.getHostAddress(); + } + +} diff --git a/src/main/java/com/baidu/fsg/uid/utils/PaddedAtomicLong.java b/src/main/java/com/github/wujun234/uid/utils/PaddedAtomicLong.java similarity index 97% rename from src/main/java/com/baidu/fsg/uid/utils/PaddedAtomicLong.java rename to src/main/java/com/github/wujun234/uid/utils/PaddedAtomicLong.java index c338312..5c9a34c 100644 --- a/src/main/java/com/baidu/fsg/uid/utils/PaddedAtomicLong.java +++ b/src/main/java/com/github/wujun234/uid/utils/PaddedAtomicLong.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.baidu.fsg.uid.utils; +package com.github.wujun234.uid.utils; import java.util.concurrent.atomic.AtomicLong; diff --git a/src/main/java/com/baidu/fsg/uid/utils/ValuedEnum.java b/src/main/java/com/github/wujun234/uid/utils/ValuedEnum.java similarity index 96% rename from src/main/java/com/baidu/fsg/uid/utils/ValuedEnum.java rename to src/main/java/com/github/wujun234/uid/utils/ValuedEnum.java index 22a4964..9c2dec7 100644 --- a/src/main/java/com/baidu/fsg/uid/utils/ValuedEnum.java +++ b/src/main/java/com/github/wujun234/uid/utils/ValuedEnum.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.baidu.fsg.uid.utils; +package com.github.wujun234.uid.utils; /** * {@code ValuedEnum} defines an enumeration which is bounded to a value, you diff --git a/src/main/java/com/baidu/fsg/uid/worker/DisposableWorkerIdAssigner.java b/src/main/java/com/github/wujun234/uid/worker/DisposableWorkerIdAssigner.java similarity index 71% rename from src/main/java/com/baidu/fsg/uid/worker/DisposableWorkerIdAssigner.java rename to src/main/java/com/github/wujun234/uid/worker/DisposableWorkerIdAssigner.java index 26570c9..90cf9f1 100644 --- a/src/main/java/com/baidu/fsg/uid/worker/DisposableWorkerIdAssigner.java +++ b/src/main/java/com/github/wujun234/uid/worker/DisposableWorkerIdAssigner.java @@ -13,12 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.baidu.fsg.uid.worker; +package com.github.wujun234.uid.worker; -import com.baidu.fsg.uid.utils.DockerUtils; -import com.baidu.fsg.uid.utils.NetUtils; -import com.baidu.fsg.uid.worker.dao.WorkerNodeDAO; -import com.baidu.fsg.uid.worker.entity.WorkerNodeEntity; +import com.github.wujun234.uid.worker.dao.WorkerNodeDAO; +import com.github.wujun234.uid.worker.entity.WorkerNodeEntity; +import com.github.wujun234.uid.utils.DockerUtils; +import com.github.wujun234.uid.utils.NetUtils; import org.apache.commons.lang.math.RandomUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,6 +46,7 @@ public class DisposableWorkerIdAssigner implements WorkerIdAssigner { * @return assigned worker id */ @Transactional + @Override public long assignWorkerId() { // build worker node entity WorkerNodeEntity workerNodeEntity = buildWorkerNode(); @@ -57,6 +58,12 @@ public long assignWorkerId() { return workerNodeEntity.getId(); } + @Transactional + @Override + public long assignFakeWorkerId() { + return buildFakeWorkerNode().getId(); + } + /** * Build worker node entity by IP and PORT */ @@ -66,7 +73,6 @@ private WorkerNodeEntity buildWorkerNode() { workerNodeEntity.setType(WorkerNodeType.CONTAINER.value()); workerNodeEntity.setHostName(DockerUtils.getDockerHost()); workerNodeEntity.setPort(DockerUtils.getDockerPort()); - } else { workerNodeEntity.setType(WorkerNodeType.ACTUAL.value()); workerNodeEntity.setHostName(NetUtils.getLocalAddress()); @@ -76,4 +82,16 @@ private WorkerNodeEntity buildWorkerNode() { return workerNodeEntity; } + private WorkerNodeEntity buildFakeWorkerNode() { + WorkerNodeEntity workerNodeEntity = new WorkerNodeEntity(); + workerNodeEntity.setType(WorkerNodeType.FAKE.value()); + if (DockerUtils.isDocker()) { + workerNodeEntity.setHostName(DockerUtils.getDockerHost()); + workerNodeEntity.setPort(DockerUtils.getDockerPort() + "-" + RandomUtils.nextInt(100000)); + }else { + workerNodeEntity.setHostName(NetUtils.getLocalAddress()); + workerNodeEntity.setPort(System.currentTimeMillis() + "-" + RandomUtils.nextInt(100000)); + } + return workerNodeEntity; + } } diff --git a/src/main/java/com/baidu/fsg/uid/worker/WorkerIdAssigner.java b/src/main/java/com/github/wujun234/uid/worker/WorkerIdAssigner.java similarity index 75% rename from src/main/java/com/baidu/fsg/uid/worker/WorkerIdAssigner.java rename to src/main/java/com/github/wujun234/uid/worker/WorkerIdAssigner.java index 25c14c3..02eee88 100644 --- a/src/main/java/com/baidu/fsg/uid/worker/WorkerIdAssigner.java +++ b/src/main/java/com/github/wujun234/uid/worker/WorkerIdAssigner.java @@ -13,20 +13,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.baidu.fsg.uid.worker; +package com.github.wujun234.uid.worker; + +import com.github.wujun234.uid.impl.DefaultUidGenerator; /** - * Represents a worker id assigner for {@link com.baidu.fsg.uid.impl.DefaultUidGenerator} + * Represents a worker id assigner for {@link DefaultUidGenerator} * * @author yutianbao */ public interface WorkerIdAssigner { /** - * Assign worker id for {@link com.baidu.fsg.uid.impl.DefaultUidGenerator} + * Assign worker id for {@link DefaultUidGenerator} * * @return assigned worker id */ long assignWorkerId(); + long assignFakeWorkerId(); + } diff --git a/src/main/java/com/baidu/fsg/uid/worker/WorkerNodeType.java b/src/main/java/com/github/wujun234/uid/worker/WorkerNodeType.java similarity index 89% rename from src/main/java/com/baidu/fsg/uid/worker/WorkerNodeType.java rename to src/main/java/com/github/wujun234/uid/worker/WorkerNodeType.java index b69b240..8cab26e 100644 --- a/src/main/java/com/baidu/fsg/uid/worker/WorkerNodeType.java +++ b/src/main/java/com/github/wujun234/uid/worker/WorkerNodeType.java @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.baidu.fsg.uid.worker; +package com.github.wujun234.uid.worker; -import com.baidu.fsg.uid.utils.ValuedEnum; +import com.github.wujun234.uid.utils.ValuedEnum; /** * WorkerNodeType @@ -26,7 +26,7 @@ */ public enum WorkerNodeType implements ValuedEnum { - CONTAINER(1), ACTUAL(2); + CONTAINER(1), ACTUAL(2), FAKE(3); /** * Lock type diff --git a/src/main/java/com/baidu/fsg/uid/worker/dao/WorkerNodeDAO.java b/src/main/java/com/github/wujun234/uid/worker/dao/WorkerNodeDAO.java similarity index 53% rename from src/main/java/com/baidu/fsg/uid/worker/dao/WorkerNodeDAO.java rename to src/main/java/com/github/wujun234/uid/worker/dao/WorkerNodeDAO.java index 86d7f27..bc0e8f6 100644 --- a/src/main/java/com/baidu/fsg/uid/worker/dao/WorkerNodeDAO.java +++ b/src/main/java/com/github/wujun234/uid/worker/dao/WorkerNodeDAO.java @@ -13,16 +13,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.baidu.fsg.uid.worker.dao; +package com.github.wujun234.uid.worker.dao; -import com.baidu.fsg.uid.worker.entity.WorkerNodeEntity; +import com.github.wujun234.uid.worker.entity.WorkerNodeEntity; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Options; import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; import org.springframework.stereotype.Repository; /** * DAO for M_WORKER_NODE * * @author yutianbao + * @author wujun */ @Repository public interface WorkerNodeDAO { @@ -34,6 +38,18 @@ public interface WorkerNodeDAO { * @param port * @return */ + @Select("SELECT " + + " ID," + + " HOST_NAME," + + " PORT," + + " TYPE," + + " LAUNCH_DATE," + + " MODIFIED," + + " CREATED" + + " FROM" + + " WORKER_NODE" + + " WHERE" + + " HOST_NAME = #{host,jdbcType=VARCHAR} AND PORT = #{port,jdbcType=VARCHAR}") WorkerNodeEntity getWorkerNodeByHostPort(@Param("host") String host, @Param("port") String port); /** @@ -41,6 +57,21 @@ public interface WorkerNodeDAO { * * @param workerNodeEntity */ + @Insert("INSERT INTO WORKER_NODE" + + "(HOST_NAME," + + "PORT," + + "TYPE," + + "LAUNCH_DATE," + + "MODIFIED," + + "CREATED)" + + "VALUES (" + + "#{hostName}," + + "#{port}," + + "#{type}," + + "#{launchDate}," + + "NOW()," + + "NOW())") + @Options(useGeneratedKeys = true, keyColumn = "id") void addWorkerNode(WorkerNodeEntity workerNodeEntity); } diff --git a/src/main/java/com/baidu/fsg/uid/worker/entity/WorkerNodeEntity.java b/src/main/java/com/github/wujun234/uid/worker/entity/WorkerNodeEntity.java similarity index 96% rename from src/main/java/com/baidu/fsg/uid/worker/entity/WorkerNodeEntity.java rename to src/main/java/com/github/wujun234/uid/worker/entity/WorkerNodeEntity.java index 78964a1..1dc5112 100644 --- a/src/main/java/com/baidu/fsg/uid/worker/entity/WorkerNodeEntity.java +++ b/src/main/java/com/github/wujun234/uid/worker/entity/WorkerNodeEntity.java @@ -13,15 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.baidu.fsg.uid.worker.entity; +package com.github.wujun234.uid.worker.entity; import java.util.Date; +import com.github.wujun234.uid.worker.WorkerNodeType; import org.apache.commons.lang.builder.ReflectionToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; -import com.baidu.fsg.uid.worker.WorkerNodeType; - /** * Entity for M_WORKER_NODE * diff --git a/src/main/resources/META-INF/mybatis/mapper/WORKER_NODE.xml b/src/main/resources/META-INF/mybatis/mapper/WORKER_NODE.xml deleted file mode 100644 index e8cefcb..0000000 --- a/src/main/resources/META-INF/mybatis/mapper/WORKER_NODE.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - INSERT INTO WORKER_NODE - (HOST_NAME, - PORT, - TYPE, - LAUNCH_DATE, - MODIFIED, - CREATED) - VALUES ( - #{hostName}, - #{port}, - #{type}, - #{launchDate}, - NOW(), - NOW()) - - - - \ No newline at end of file diff --git a/src/main/resources/META-INF/spring.factories b/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..5de415c --- /dev/null +++ b/src/main/resources/META-INF/spring.factories @@ -0,0 +1 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.github.wujun234.uid.UidAutoConfigure \ No newline at end of file diff --git a/src/main/scripts/WORKER_NODE.sql b/src/main/scripts/WORKER_NODE.sql index d9f4212..4190d6a 100644 --- a/src/main/scripts/WORKER_NODE.sql +++ b/src/main/scripts/WORKER_NODE.sql @@ -4,7 +4,7 @@ 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: ACTUAL or CONTAINER', +TYPE INT NOT NULL COMMENT 'node type: CONTAINER(1), ACTUAL(2), FAKE(3)', LAUNCH_DATE DATE NOT NULL COMMENT 'launch date', MODIFIED TIMESTAMP NOT NULL COMMENT 'modified time', CREATED TIMESTAMP NOT NULL COMMENT 'created time', diff --git a/src/test/java/com/baidu/fsg/uid/CachedUidGeneratorTest.java b/src/test/java/com/github/wujun234/uid/CachedUidGeneratorTest.java similarity index 87% rename from src/test/java/com/baidu/fsg/uid/CachedUidGeneratorTest.java rename to src/test/java/com/github/wujun234/uid/CachedUidGeneratorTest.java index f6801a3..890a59b 100644 --- a/src/test/java/com/baidu/fsg/uid/CachedUidGeneratorTest.java +++ b/src/test/java/com/github/wujun234/uid/CachedUidGeneratorTest.java @@ -1,127 +1,131 @@ -package com.baidu.fsg.uid; - -import com.baidu.fsg.uid.impl.CachedUidGenerator; -import org.apache.commons.lang.StringUtils; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -import javax.annotation.Resource; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.concurrent.ConcurrentSkipListSet; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * Test for {@link CachedUidGenerator} - * - * @author yutianbao - */ -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(locations = { "classpath:uid/cached-uid-spring.xml" }) -public class CachedUidGeneratorTest { - private static final int SIZE = 7000000; // 700w - private static final boolean VERBOSE = false; - private static final int THREADS = Runtime.getRuntime().availableProcessors() << 1; - - @Resource - private UidGenerator uidGenerator; - - /** - * Test for serially generate - * - * @throws IOException - */ - @Test - public void testSerialGenerate() throws IOException { - // Generate UID serially - Set uidSet = new HashSet<>(SIZE); - for (int i = 0; i < SIZE; i++) { - doGenerate(uidSet, i); - } - - // Check UIDs are all unique - checkUniqueID(uidSet); - } - - /** - * Test for parallel generate - * - * @throws InterruptedException - * @throws IOException - */ - @Test - public void testParallelGenerate() throws InterruptedException, IOException { - AtomicInteger control = new AtomicInteger(-1); - Set uidSet = new ConcurrentSkipListSet<>(); - - // Initialize threads - List threadList = new ArrayList<>(THREADS); - for (int i = 0; i < THREADS; i++) { - Thread thread = new Thread(() -> workerRun(uidSet, control)); - thread.setName("UID-generator-" + i); - - threadList.add(thread); - thread.start(); - } - - // Wait for worker done - for (Thread thread : threadList) { - thread.join(); - } - - // Check generate 700w times - Assert.assertEquals(SIZE, control.get()); - - // Check UIDs are all unique - checkUniqueID(uidSet); - } - - /** - * Woker run - */ - private void workerRun(Set uidSet, AtomicInteger control) { - for (;;) { - int myPosition = control.updateAndGet(old -> (old == SIZE ? SIZE : old + 1)); - if (myPosition == SIZE) { - return; - } - - doGenerate(uidSet, myPosition); - } - } - - /** - * Do generating - */ - private void doGenerate(Set uidSet, int index) { - long uid = uidGenerator.getUID(); - String parsedInfo = uidGenerator.parseUID(uid); - boolean existed = !uidSet.add(uid); - if (existed) { - System.out.println("Found duplicate UID " + uid); - } - - // Check UID is positive, and can be parsed - Assert.assertTrue(uid > 0L); - Assert.assertTrue(StringUtils.isNotBlank(parsedInfo)); - - if (VERBOSE) { - System.out.println(Thread.currentThread().getName() + " No." + index + " >>> " + parsedInfo); - } - } - - /** - * Check UIDs are all unique - */ - private void checkUniqueID(Set uidSet) throws IOException { - System.out.println(uidSet.size()); - Assert.assertEquals(SIZE, uidSet.size()); - } - -} +package com.github.wujun234.uid; + +import com.github.wujun234.uid.impl.CachedUidGenerator; +import org.apache.commons.lang.StringUtils; +import org.junit.Assert; +import org.junit.Ignore; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import javax.annotation.Resource; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.ConcurrentSkipListSet; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * Test for {@link CachedUidGenerator} + * + * @author yutianbao + * @author wujun + */ +@Ignore +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest(webEnvironment = WebEnvironment.NONE) +public class CachedUidGeneratorTest { + private static final int SIZE = 7000000; // 700w + private static final boolean VERBOSE = false; + private static final int THREADS = Runtime.getRuntime().availableProcessors() << 1; + + @Resource + private UidGenerator cachedUidGenerator; + + /** + * Test for serially generate + * + * @throws IOException + */ + @Test + public void testSerialGenerate() throws IOException { + // Generate UID serially + Set uidSet = new HashSet<>(SIZE); + for (int i = 0; i < SIZE; i++) { + doGenerate(uidSet, i); + } + + // Check UIDs are all unique + checkUniqueID(uidSet); + } + + /** + * Test for parallel generate + * + * @throws InterruptedException + * @throws IOException + */ + @Test + public void testParallelGenerate() throws InterruptedException, IOException { + AtomicInteger control = new AtomicInteger(-1); + Set uidSet = new ConcurrentSkipListSet<>(); + + // Initialize threads + List threadList = new ArrayList<>(THREADS); + for (int i = 0; i < THREADS; i++) { + Thread thread = new Thread(() -> workerRun(uidSet, control)); + thread.setName("UID-generator-" + i); + + threadList.add(thread); + thread.start(); + } + + // Wait for worker done + for (Thread thread : threadList) { + thread.join(); + } + + // Check generate 700w times + Assert.assertEquals(SIZE, control.get()); + + // Check UIDs are all unique + checkUniqueID(uidSet); + } + + /** + * Woker run + */ + private void workerRun(Set uidSet, AtomicInteger control) { + for (;;) { + int myPosition = control.updateAndGet(old -> (old == SIZE ? SIZE : old + 1)); + if (myPosition == SIZE) { + return; + } + + doGenerate(uidSet, myPosition); + } + } + + /** + * Do generating + */ + private void doGenerate(Set uidSet, int index) { + long uid = cachedUidGenerator.getUID(); + String parsedInfo = cachedUidGenerator.parseUID(uid); + boolean existed = !uidSet.add(uid); + if (existed) { + System.out.println("Found duplicate UID " + uid); + } + + // Check UID is positive, and can be parsed + Assert.assertTrue(uid > 0L); + Assert.assertTrue(StringUtils.isNotBlank(parsedInfo)); + + if (VERBOSE) { + System.out.println(Thread.currentThread().getName() + " No." + index + " >>> " + parsedInfo); + } + } + + /** + * Check UIDs are all unique + */ + private void checkUniqueID(Set uidSet) throws IOException { + System.out.println(uidSet.size()); + Assert.assertEquals(SIZE, uidSet.size()); + } + +} diff --git a/src/test/java/com/baidu/fsg/uid/DefaultUidGeneratorTest.java b/src/test/java/com/github/wujun234/uid/DefaultUidGeneratorTest.java similarity index 84% rename from src/test/java/com/baidu/fsg/uid/DefaultUidGeneratorTest.java rename to src/test/java/com/github/wujun234/uid/DefaultUidGeneratorTest.java index 62364c5..6a87c61 100644 --- a/src/test/java/com/baidu/fsg/uid/DefaultUidGeneratorTest.java +++ b/src/test/java/com/github/wujun234/uid/DefaultUidGeneratorTest.java @@ -1,122 +1,123 @@ -package com.baidu.fsg.uid; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.concurrent.ConcurrentSkipListSet; -import java.util.concurrent.atomic.AtomicInteger; - -import javax.annotation.Resource; - -import org.apache.commons.lang.StringUtils; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -import com.baidu.fsg.uid.impl.DefaultUidGenerator; - -/** - * Test for {@link DefaultUidGenerator} - * - * @author yutianbao - */ -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(locations = { "classpath:uid/default-uid-spring.xml" }) -public class DefaultUidGeneratorTest { - private static final int SIZE = 100000; // 10w - private static final boolean VERBOSE = true; - private static final int THREADS = Runtime.getRuntime().availableProcessors() << 1; - - @Resource - private UidGenerator uidGenerator; - - /** - * Test for serially generate - */ - @Test - public void testSerialGenerate() { - // Generate UID serially - Set uidSet = new HashSet<>(SIZE); - for (int i = 0; i < SIZE; i++) { - doGenerate(uidSet, i); - } - - // Check UIDs are all unique - checkUniqueID(uidSet); - } - - /** - * Test for parallel generate - * - * @throws InterruptedException - */ - @Test - public void testParallelGenerate() throws InterruptedException { - AtomicInteger control = new AtomicInteger(-1); - Set uidSet = new ConcurrentSkipListSet<>(); - - // Initialize threads - List threadList = new ArrayList<>(THREADS); - for (int i = 0; i < THREADS; i++) { - Thread thread = new Thread(() -> workerRun(uidSet, control)); - thread.setName("UID-generator-" + i); - - threadList.add(thread); - thread.start(); - } - - // Wait for worker done - for (Thread thread : threadList) { - thread.join(); - } - - // Check generate 10w times - Assert.assertEquals(SIZE, control.get()); - - // Check UIDs are all unique - checkUniqueID(uidSet); - } - - /** - * Worker run - */ - private void workerRun(Set uidSet, AtomicInteger control) { - for (;;) { - int myPosition = control.updateAndGet(old -> (old == SIZE ? SIZE : old + 1)); - if (myPosition == SIZE) { - return; - } - - doGenerate(uidSet, myPosition); - } - } - - /** - * Do generating - */ - private void doGenerate(Set uidSet, int index) { - long uid = uidGenerator.getUID(); - String parsedInfo = uidGenerator.parseUID(uid); - uidSet.add(uid); - - // Check UID is positive, and can be parsed - Assert.assertTrue(uid > 0L); - Assert.assertTrue(StringUtils.isNotBlank(parsedInfo)); - - if (VERBOSE) { - System.out.println(Thread.currentThread().getName() + " No." + index + " >>> " + parsedInfo); - } - } - - /** - * Check UIDs are all unique - */ - private void checkUniqueID(Set uidSet) { - System.out.println(uidSet.size()); - Assert.assertEquals(SIZE, uidSet.size()); - } - -} +package com.github.wujun234.uid; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.ConcurrentSkipListSet; +import java.util.concurrent.atomic.AtomicInteger; + +import com.github.wujun234.uid.impl.DefaultUidGenerator; +import org.apache.commons.lang.StringUtils; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * Test for {@link DefaultUidGenerator} + * + * @author yutianbao + * @author wujun + */ +//@Ignore +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest(webEnvironment = WebEnvironment.NONE) +public class DefaultUidGeneratorTest { + private static final int SIZE = 100000; // 10w + private static final boolean VERBOSE = true; + private static final int THREADS = Runtime.getRuntime().availableProcessors() << 1; + + @Autowired + private UidGenerator defaultUidGenerator; + + /** + * Test for serially generate + */ + @Test + public void testSerialGenerate() { + // Generate UID serially + Set uidSet = new HashSet<>(SIZE); + for (int i = 0; i < SIZE; i++) { + doGenerate(uidSet, i); + } + + // Check UIDs are all unique + checkUniqueID(uidSet); + } + + /** + * Test for parallel generate + * + * @throws InterruptedException + */ + @Test + public void testParallelGenerate() throws InterruptedException { + AtomicInteger control = new AtomicInteger(-1); + Set uidSet = new ConcurrentSkipListSet<>(); + + // Initialize threads + List threadList = new ArrayList<>(THREADS); + for (int i = 0; i < THREADS; i++) { + Thread thread = new Thread(() -> workerRun(uidSet, control)); + thread.setName("UID-generator-" + i); + + threadList.add(thread); + thread.start(); + } + + // Wait for worker done + for (Thread thread : threadList) { + thread.join(); + } + + // Check generate 10w times + Assert.assertEquals(SIZE, control.get()); + + // Check UIDs are all unique + checkUniqueID(uidSet); + } + + /** + * Worker run + */ + private void workerRun(Set uidSet, AtomicInteger control) { + for (;;) { + int myPosition = control.updateAndGet(old -> (old == SIZE ? SIZE : old + 1)); + if (myPosition == SIZE) { + return; + } + + doGenerate(uidSet, myPosition); + } + } + + /** + * Do generating + */ + private void doGenerate(Set uidSet, int index) { + long uid = defaultUidGenerator.getUID(); + String parsedInfo = defaultUidGenerator.parseUID(uid); + uidSet.add(uid); + + // Check UID is positive, and can be parsed + Assert.assertTrue(uid > 0L); + Assert.assertTrue(StringUtils.isNotBlank(parsedInfo)); + + if (VERBOSE) { + System.out.println(Thread.currentThread().getName() + " No." + index + " >>> " + parsedInfo); + } + } + + /** + * Check UIDs are all unique + */ + private void checkUniqueID(Set uidSet) { + System.out.println(uidSet.size()); + Assert.assertEquals(SIZE, uidSet.size()); + } + +} diff --git a/src/test/java/com/github/wujun234/uid/UidTestApplication.java b/src/test/java/com/github/wujun234/uid/UidTestApplication.java new file mode 100644 index 0000000..c21b865 --- /dev/null +++ b/src/test/java/com/github/wujun234/uid/UidTestApplication.java @@ -0,0 +1,25 @@ +package com.github.wujun234.uid; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + + +/** + * UID 测试主类 + * + * @author wujun + * @date 2019.02.20 11:01 + */ +@SpringBootApplication +public class UidTestApplication { + + public static void main(String[] args) { + SpringApplication.run(UidTestApplication.class, args); + } + +// @Bean +// @ConditionalOnMissingBean +// WorkerIdAssigner workerIdAssigner() { +// return new DisposableWorkerIdAssigner(); +// } +} diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml new file mode 100644 index 0000000..ed4e115 --- /dev/null +++ b/src/test/resources/application.yml @@ -0,0 +1,24 @@ +mybatis: + configuration: + default-fetch-size: 100 + default-statement-timeout: 30 + map-underscore-to-camel-case: true +spring: + datasource: + driver-class-name: com.mysql.jdbc.Driver + url: jdbc:mysql://xxx + username: xxx + password: xxx + +# 以下为可选配置, 如未指定将采用默认值 +uid: + timeBits: 30 # 时间位, 默认:30 + workerBits: 16 # 机器位, 默认:16 + seqBits: 7 # 序列号, 默认:7 + epochStr: "2019-02-20" # 初始时间, 默认:"2019-02-20" + enableBackward: true # 是否容忍时钟回拨, 默认:true + maxBackwardSeconds: 1 # 时钟回拨最长容忍时间(秒), 默认:1 + CachedUidGenerator: # CachedUidGenerator相关参数 + boostPower: 3 # RingBuffer size扩容参数, 可提高UID生成的吞吐量, 默认:3 + paddingFactor: 50 # 指定何时向RingBuffer中填充UID, 取值为百分比(0, 100), 默认为50 + #scheduleInterval: 60 # 默认:不配置此项, 即不实用Schedule线程. 如需使用, 请指定Schedule线程时间间隔, 单位:秒 diff --git a/src/test/resources/uid/cached-uid-spring.xml b/src/test/resources/uid/cached-uid-spring.xml deleted file mode 100644 index 7f81032..0000000 --- a/src/test/resources/uid/cached-uid-spring.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/test/resources/uid/default-uid-spring.xml b/src/test/resources/uid/default-uid-spring.xml deleted file mode 100644 index 188be7f..0000000 --- a/src/test/resources/uid/default-uid-spring.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/src/test/resources/uid/mybatis-spring.xml b/src/test/resources/uid/mybatis-spring.xml deleted file mode 100644 index 6339e9e..0000000 --- a/src/test/resources/uid/mybatis-spring.xml +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - classpath:/uid/*.properties - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/test/resources/uid/mysql.properties b/src/test/resources/uid/mysql.properties deleted file mode 100644 index 01f1d6b..0000000 --- a/src/test/resources/uid/mysql.properties +++ /dev/null @@ -1,23 +0,0 @@ -#datasource db info -mysql.driver=com.mysql.jdbc.Driver -jdbc.url=jdbc:mysql://localhost:xxxx/xxxx -jdbc.username=xxxx -jdbc.password=xxxx -jdbc.maxActive=2 - -#datasource base -datasource.defaultAutoCommit=true -datasource.initialSize=2 -datasource.minIdle=0 -datasource.maxWait=5000 -datasource.testWhileIdle=true -datasource.testOnBorrow=true -datasource.testOnReturn=false -datasource.validationQuery=SELECT 1 FROM DUAL -datasource.timeBetweenEvictionRunsMillis=30000 -datasource.minEvictableIdleTimeMillis=60000 -datasource.logAbandoned=true -datasource.removeAbandoned=true -datasource.removeAbandonedTimeout=120 -datasource.filters=stat - From acefc50bb3973842e82ed75c68db4947318a0b0f Mon Sep 17 00:00:00 2001 From: junwu215177 Date: Wed, 20 Feb 2019 17:49:08 +0800 Subject: [PATCH 02/10] =?UTF-8?q?=E6=95=B4=E7=90=86=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../uid/buffer/BufferPaddingExecutor.java | 3 ++- .../wujun234/uid/impl/DefaultUidGenerator.java | 2 +- .../wujun234/uid/utils/NamingThreadFactory.java | 1 + .../com/github/wujun234/uid/utils/ValuedEnum.java | 7 ++++++- .../uid/worker/DisposableWorkerIdAssigner.java | 4 ++-- .../wujun234/uid/worker/WorkerIdAssigner.java | 9 +++++++-- .../wujun234/uid/worker/WorkerNodeType.java | 15 +++++++++++++-- .../github/wujun234/uid/UidTestApplication.java | 6 ------ 8 files changed, 32 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/github/wujun234/uid/buffer/BufferPaddingExecutor.java b/src/main/java/com/github/wujun234/uid/buffer/BufferPaddingExecutor.java index e2c7c6e..dee6623 100644 --- a/src/main/java/com/github/wujun234/uid/buffer/BufferPaddingExecutor.java +++ b/src/main/java/com/github/wujun234/uid/buffer/BufferPaddingExecutor.java @@ -40,7 +40,8 @@ public class BufferPaddingExecutor { /** Constants */ private static final String WORKER_NAME = "RingBuffer-Padding-Worker"; private static final String SCHEDULE_NAME = "RingBuffer-Padding-Schedule"; - private static final long DEFAULT_SCHEDULE_INTERVAL = 5 * 60L; // 5 minutes + /** 5 minutes */ + private static final long DEFAULT_SCHEDULE_INTERVAL = 5 * 60L; /** Whether buffer padding is running */ private final AtomicBoolean running; diff --git a/src/main/java/com/github/wujun234/uid/impl/DefaultUidGenerator.java b/src/main/java/com/github/wujun234/uid/impl/DefaultUidGenerator.java index 528dbaf..664f162 100644 --- a/src/main/java/com/github/wujun234/uid/impl/DefaultUidGenerator.java +++ b/src/main/java/com/github/wujun234/uid/impl/DefaultUidGenerator.java @@ -152,7 +152,7 @@ protected synchronized long nextId() { } } else { workerId = workerIdAssigner.assignFakeWorkerId(); - LOGGER.error("Clock moved backwards. Assign New WorkerId %d", workerId); + LOGGER.error("Clock moved backwards. Assigned New WorkerId %d", workerId); if (workerId > bitsAllocator.getMaxWorkerId()) { LOGGER.error("Worker id " + workerId + " exceeds the max " + bitsAllocator.getMaxWorkerId()); workerId = workerId % bitsAllocator.getMaxWorkerId(); diff --git a/src/main/java/com/github/wujun234/uid/utils/NamingThreadFactory.java b/src/main/java/com/github/wujun234/uid/utils/NamingThreadFactory.java index 43a29b3..9121245 100644 --- a/src/main/java/com/github/wujun234/uid/utils/NamingThreadFactory.java +++ b/src/main/java/com/github/wujun234/uid/utils/NamingThreadFactory.java @@ -91,6 +91,7 @@ public Thread newThread(Runnable r) { thread.setUncaughtExceptionHandler(this.uncaughtExceptionHandler); } else { thread.setUncaughtExceptionHandler(new UncaughtExceptionHandler() { + @Override public void uncaughtException(Thread t, Throwable e) { LOGGER.error("unhandled exception in thread: " + t.getId() + ":" + t.getName(), e); } diff --git a/src/main/java/com/github/wujun234/uid/utils/ValuedEnum.java b/src/main/java/com/github/wujun234/uid/utils/ValuedEnum.java index 9c2dec7..a2d1b92 100644 --- a/src/main/java/com/github/wujun234/uid/utils/ValuedEnum.java +++ b/src/main/java/com/github/wujun234/uid/utils/ValuedEnum.java @@ -19,9 +19,14 @@ * {@code ValuedEnum} defines an enumeration which is bounded to a value, you * may implements this interface when you defines such kind of enumeration, that * you can use {@link EnumUtils} to simplify parse and valueOf operation. - * + * * @author yutianbao */ public interface ValuedEnum { + /** + * get value + * + * @return T + */ T value(); } diff --git a/src/main/java/com/github/wujun234/uid/worker/DisposableWorkerIdAssigner.java b/src/main/java/com/github/wujun234/uid/worker/DisposableWorkerIdAssigner.java index 90cf9f1..ee0175a 100644 --- a/src/main/java/com/github/wujun234/uid/worker/DisposableWorkerIdAssigner.java +++ b/src/main/java/com/github/wujun234/uid/worker/DisposableWorkerIdAssigner.java @@ -45,7 +45,7 @@ public class DisposableWorkerIdAssigner implements WorkerIdAssigner { * * @return assigned worker id */ - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public long assignWorkerId() { // build worker node entity @@ -58,7 +58,7 @@ public long assignWorkerId() { return workerNodeEntity.getId(); } - @Transactional + @Transactional(rollbackFor = Exception.class) @Override public long assignFakeWorkerId() { return buildFakeWorkerNode().getId(); diff --git a/src/main/java/com/github/wujun234/uid/worker/WorkerIdAssigner.java b/src/main/java/com/github/wujun234/uid/worker/WorkerIdAssigner.java index 02eee88..c7088e4 100644 --- a/src/main/java/com/github/wujun234/uid/worker/WorkerIdAssigner.java +++ b/src/main/java/com/github/wujun234/uid/worker/WorkerIdAssigner.java @@ -19,18 +19,23 @@ /** * Represents a worker id assigner for {@link DefaultUidGenerator} - * + * * @author yutianbao */ public interface WorkerIdAssigner { /** * Assign worker id for {@link DefaultUidGenerator} - * + * * @return assigned worker id */ long assignWorkerId(); + /** + * Assign fake worker id + * + * @return assigned fake worker id + */ long assignFakeWorkerId(); } diff --git a/src/main/java/com/github/wujun234/uid/worker/WorkerNodeType.java b/src/main/java/com/github/wujun234/uid/worker/WorkerNodeType.java index 8cab26e..41fefcf 100644 --- a/src/main/java/com/github/wujun234/uid/worker/WorkerNodeType.java +++ b/src/main/java/com/github/wujun234/uid/worker/WorkerNodeType.java @@ -21,12 +21,23 @@ * WorkerNodeType *

  • CONTAINER: Such as Docker *
  • ACTUAL: Actual machine - * + * * @author yutianbao */ public enum WorkerNodeType implements ValuedEnum { - CONTAINER(1), ACTUAL(2), FAKE(3); + /** + * 容器 + */ + CONTAINER(1), + /** + * 物理机 + */ + ACTUAL(2), + /** + * 虚拟 + */ + FAKE(3); /** * Lock type diff --git a/src/test/java/com/github/wujun234/uid/UidTestApplication.java b/src/test/java/com/github/wujun234/uid/UidTestApplication.java index c21b865..61e2d11 100644 --- a/src/test/java/com/github/wujun234/uid/UidTestApplication.java +++ b/src/test/java/com/github/wujun234/uid/UidTestApplication.java @@ -16,10 +16,4 @@ public class UidTestApplication { public static void main(String[] args) { SpringApplication.run(UidTestApplication.class, args); } - -// @Bean -// @ConditionalOnMissingBean -// WorkerIdAssigner workerIdAssigner() { -// return new DisposableWorkerIdAssigner(); -// } } From 85685459e0b0361e1b9f68055c31c730d34483e5 Mon Sep 17 00:00:00 2001 From: junwu215177 Date: Wed, 20 Feb 2019 18:09:43 +0800 Subject: [PATCH 03/10] =?UTF-8?q?=E6=95=B4=E7=90=86=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 806fe11..d118d48 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ PRIMARY KEY(ID) com.github.wujun234 uid-generator-spring-boot-starter - 1.0.1.RELEASE + 1.0.2.RELEASE ``` ### 步骤3: 开始使用 From c0a395ba906356f06b44421574e1a6287b3b0a37 Mon Sep 17 00:00:00 2001 From: junwu215177 Date: Thu, 21 Feb 2019 10:32:42 +0800 Subject: [PATCH 04/10] =?UTF-8?q?=E5=8F=91=E5=B8=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- pom.xml | 135 ++++++++++++++---- .../wujun234/uid/DefaultUidGeneratorTest.java | 3 +- 3 files changed, 108 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index d118d48..358712b 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ uid-generator-spring-boot-starter ========================== 基于 [百度UidGenerator](https://github.com/baidu/uid-generator), 做了以下改动: -- 改造为spring-boot-starter的形式,建表、引入,即可使用 +- 改造为spring-boot-starter的形式,不用部署为分布式,直接建表、在项目中引入,即可使用 - 针对时钟回拨,提供了修正选项(默认启用,可通过配置关闭),小于阈值直接休眠,大于阈值更改机器号 - 对机器id用尽提供了复用策略:取余 - 解除id位数限制,由“必须64位”改为“不大于64位”,可根据需要获取更短id diff --git a/pom.xml b/pom.xml index e836117..f2f17b4 100644 --- a/pom.xml +++ b/pom.xml @@ -3,31 +3,42 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - uid-generator-spring-boot-starter - An unique id generator com.github.wujun234 uid-generator-spring-boot-starter - 1.0.1.RELEASE + 1.0.2.RELEASE jar + uid-generator-spring-boot-starter + An unique id generator based on baidu uid-generator + https://github.com/wujun234/uid-generator-spring-boot-starter + UTF-8 1.8 - - - - org.springframework.boot - spring-boot-dependencies - 2.1.3.RELEASE - pom - import - - - + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + https://github.com/wujun234/uid-generator-spring-boot-starter + https://github.com/wujun234/uid-generator-spring-boot-starter.git + https://github.com/wujun234 + + + + + wujun + wujun234@gmail.com + + @@ -57,40 +68,104 @@ spring-boot-starter-test test - mysql mysql-connector-java test - + + + + org.springframework.boot + spring-boot-dependencies + 2.1.3.RELEASE + pom + import + + + + + org.apache.maven.plugins maven-compiler-plugin + 3.8.0 ${jdk.version} ${jdk.version} ${project.build.sourceEncoding} - 3.5.1 - - - org.apache.maven.plugins - maven-source-plugin - 2.3 - - - package - - jar - - - + + + + release + + + + + org.apache.maven.plugins + maven-source-plugin + 3.0.1 + + + attach-sources + + jar-no-fork + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.0.1 + + + none + + + + package + + jar + + + + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.6 + + + verify + + sign + + + + + + + + + oss + https://oss.sonatype.org/content/repositories/snapshots/ + + + oss + https://oss.sonatype.org/service/local/staging/deploy/maven2/ + + + + \ No newline at end of file diff --git a/src/test/java/com/github/wujun234/uid/DefaultUidGeneratorTest.java b/src/test/java/com/github/wujun234/uid/DefaultUidGeneratorTest.java index 6a87c61..91b438c 100644 --- a/src/test/java/com/github/wujun234/uid/DefaultUidGeneratorTest.java +++ b/src/test/java/com/github/wujun234/uid/DefaultUidGeneratorTest.java @@ -10,6 +10,7 @@ import com.github.wujun234.uid.impl.DefaultUidGenerator; import org.apache.commons.lang.StringUtils; import org.junit.Assert; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -23,7 +24,7 @@ * @author yutianbao * @author wujun */ -//@Ignore +@Ignore @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(webEnvironment = WebEnvironment.NONE) public class DefaultUidGeneratorTest { From 675953bf30c92b7c5bbb008c7c16b02c95f863f3 Mon Sep 17 00:00:00 2001 From: WuJun Date: Tue, 23 Feb 2021 10:49:37 +0800 Subject: [PATCH 05/10] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 358712b..52d53dc 100644 --- a/README.md +++ b/README.md @@ -94,11 +94,11 @@ uid: CachedUidGenerator: # CachedUidGenerator相关参数 boostPower: 3 # RingBuffer size扩容参数, 可提高UID生成的吞吐量, 默认:3 paddingFactor: 50 # 指定何时向RingBuffer中填充UID, 取值为百分比(0, 100), 默认为50 - #scheduleInterval: 60 # 默认:不配置此项, 即不实用Schedule线程. 如需使用, 请指定Schedule线程时间间隔, 单位:秒 + #scheduleInterval: 60 # 默认:不配置此项, 即不使用Schedule线程. 如需使用, 请指定Schedule线程时间间隔, 单位:秒 ``` #### 可选实现 选用CachedUidGenerator时,可以选择实现“拒绝策略”的拓展 - 拒绝策略: 当环已满, 无法继续填充时 默认无需指定, 将丢弃Put操作, 仅日志记录. 如有特殊需求, 请实现RejectedPutBufferHandler接口(支持Lambda表达式) - 拒绝策略: 当环已空, 无法继续获取时 -默认无需指定, 将记录日志, 并抛出UidGenerateException异常. 如有特殊需求, 请实现RejectedTakeBufferHandler接口(支持Lambda表达式) \ No newline at end of file +默认无需指定, 将记录日志, 并抛出UidGenerateException异常. 如有特殊需求, 请实现RejectedTakeBufferHandler接口(支持Lambda表达式) From 2bd00e609c79fcb82e719241167703623ef33fe5 Mon Sep 17 00:00:00 2001 From: WuJun Date: Tue, 23 Feb 2021 11:04:29 +0800 Subject: [PATCH 06/10] Update README.md --- README.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/README.md b/README.md index 52d53dc..ba6ed38 100644 --- a/README.md +++ b/README.md @@ -24,9 +24,6 @@ Quick Start ### 步骤1: 创建表WORKER_NODE 在项目数据库里,运行sql脚本以导入表WORKER_NODE, 脚本如下: ```sql -DROP DATABASE IF EXISTS `xxxx`; -CREATE DATABASE `xxxx` ; -use `xxxx`; DROP TABLE IF EXISTS WORKER_NODE; CREATE TABLE WORKER_NODE ( @@ -38,8 +35,7 @@ LAUNCH_DATE DATE NOT NULL COMMENT 'launch date', MODIFIED TIMESTAMP NOT NULL COMMENT 'modified time', CREATED TIMESTAMP NOT NULL COMMENT 'created time', PRIMARY KEY(ID) -) - COMMENT='DB WorkerID Assigner for UID Generator',ENGINE = INNODB; +) COMMENT='DB WorkerID Assigner for UID Generator',ENGINE = INNODB; ``` 配置好数据库连接 From 2df4ddc7775ece2f5992bf75eda96144294cf112 Mon Sep 17 00:00:00 2001 From: joinwu Date: Tue, 23 Feb 2021 14:42:31 +0800 Subject: [PATCH 07/10] keyProperty --- .../java/com/github/wujun234/uid/worker/dao/WorkerNodeDAO.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/github/wujun234/uid/worker/dao/WorkerNodeDAO.java b/src/main/java/com/github/wujun234/uid/worker/dao/WorkerNodeDAO.java index bc0e8f6..320f781 100644 --- a/src/main/java/com/github/wujun234/uid/worker/dao/WorkerNodeDAO.java +++ b/src/main/java/com/github/wujun234/uid/worker/dao/WorkerNodeDAO.java @@ -71,7 +71,7 @@ public interface WorkerNodeDAO { "#{launchDate}," + "NOW()," + "NOW())") - @Options(useGeneratedKeys = true, keyColumn = "id") + @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id") void addWorkerNode(WorkerNodeEntity workerNodeEntity); } From 86b70aa388076b79147957fabf3001c21a4120c3 Mon Sep 17 00:00:00 2001 From: joinwu Date: Tue, 23 Feb 2021 14:46:48 +0800 Subject: [PATCH 08/10] 1.0.3.RELEASE --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f2f17b4..0407c48 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.github.wujun234 uid-generator-spring-boot-starter - 1.0.2.RELEASE + 1.0.3.RELEASE jar uid-generator-spring-boot-starter From 07321f6e20e4db5376f4f2d6e3fb8fd156365683 Mon Sep 17 00:00:00 2001 From: joinwu Date: Tue, 23 Feb 2021 15:50:56 +0800 Subject: [PATCH 09/10] oldWorkerNode --- .../uid/worker/DisposableWorkerIdAssigner.java | 16 ++++++++++++---- .../wujun234/uid/worker/dao/WorkerNodeDAO.java | 2 +- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/github/wujun234/uid/worker/DisposableWorkerIdAssigner.java b/src/main/java/com/github/wujun234/uid/worker/DisposableWorkerIdAssigner.java index ee0175a..6f51029 100644 --- a/src/main/java/com/github/wujun234/uid/worker/DisposableWorkerIdAssigner.java +++ b/src/main/java/com/github/wujun234/uid/worker/DisposableWorkerIdAssigner.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package com.github.wujun234.uid.worker; import com.github.wujun234.uid.worker.dao.WorkerNodeDAO; @@ -27,12 +28,13 @@ import javax.annotation.Resource; /** - * Represents an implementation of {@link WorkerIdAssigner}, + * Represents an implementation of {@link WorkerIdAssigner}, * the worker id will be discarded after assigned to the UidGenerator - * + * * @author yutianbao */ public class DisposableWorkerIdAssigner implements WorkerIdAssigner { + private static final Logger LOGGER = LoggerFactory.getLogger(DisposableWorkerIdAssigner.class); @Resource @@ -42,7 +44,7 @@ public class DisposableWorkerIdAssigner implements WorkerIdAssigner { * Assign worker id base on database.

    * If there is host name & port in the environment, we considered that the node runs in Docker container
    * Otherwise, the node runs on an actual machine. - * + * * @return assigned worker id */ @Transactional(rollbackFor = Exception.class) @@ -51,6 +53,12 @@ public long assignWorkerId() { // build worker node entity WorkerNodeEntity workerNodeEntity = buildWorkerNode(); + WorkerNodeEntity oldWorkerNode = workerNodeDAO + .getWorkerNodeByHostPort(workerNodeEntity.getHostName(), workerNodeEntity.getPort()); + if (null != oldWorkerNode) { + return oldWorkerNode.getId(); + } + // add worker node for new (ignore the same IP + PORT) workerNodeDAO.addWorkerNode(workerNodeEntity); LOGGER.info("Add worker node:" + workerNodeEntity); @@ -88,7 +96,7 @@ private WorkerNodeEntity buildFakeWorkerNode() { if (DockerUtils.isDocker()) { workerNodeEntity.setHostName(DockerUtils.getDockerHost()); workerNodeEntity.setPort(DockerUtils.getDockerPort() + "-" + RandomUtils.nextInt(100000)); - }else { + } else { workerNodeEntity.setHostName(NetUtils.getLocalAddress()); workerNodeEntity.setPort(System.currentTimeMillis() + "-" + RandomUtils.nextInt(100000)); } diff --git a/src/main/java/com/github/wujun234/uid/worker/dao/WorkerNodeDAO.java b/src/main/java/com/github/wujun234/uid/worker/dao/WorkerNodeDAO.java index 320f781..b1ecc4f 100644 --- a/src/main/java/com/github/wujun234/uid/worker/dao/WorkerNodeDAO.java +++ b/src/main/java/com/github/wujun234/uid/worker/dao/WorkerNodeDAO.java @@ -49,7 +49,7 @@ public interface WorkerNodeDAO { " FROM" + " WORKER_NODE" + " WHERE" + - " HOST_NAME = #{host,jdbcType=VARCHAR} AND PORT = #{port,jdbcType=VARCHAR}") + " HOST_NAME = #{host,jdbcType=VARCHAR} AND PORT = #{port,jdbcType=VARCHAR} limit 1") WorkerNodeEntity getWorkerNodeByHostPort(@Param("host") String host, @Param("port") String port); /** From 57eb5f88733004d6fd942d732ac736bd50e3eeb2 Mon Sep 17 00:00:00 2001 From: WuJun Date: Wed, 24 Feb 2021 15:52:39 +0800 Subject: [PATCH 10/10] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ba6ed38..ad0c8ff 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ PRIMARY KEY(ID) com.github.wujun234 uid-generator-spring-boot-starter - 1.0.2.RELEASE + 1.0.3.RELEASE ``` ### 步骤3: 开始使用