Sequence
Id generator based on snowflake algorithm with stronger capability.
Install / Use
/learn @mocreates/SequenceREADME
sequence
基于雪花算法的增强版ID生成器
- 解决了时间回拨的问题
- 无需手动指定workId, 微服务环境自适应
- 可配置化
快速开始
- 依赖引入
${uid-generator.version}说明<dependency> <groupId>io.github.mocreates</groupId> <artifactId>uid-generator</artifactId> <version>${uid-generator.version}</version> </dependency> - 配置序列器
Sequence@Bean public Sequence sequence() { SequenceConfig sequenceConfig = new SimpleSequenceConfig(); return new Sequence(sequenceConfig); } - 使用序列器生成ID
@Autowired private Sequence sequence; public long generateId() { return sequence.nextId(); }
配置解析
目前提供两个配置类
io.github.mocreates.config.DefaultSequenceConfigio.github.mocreates.config.SimpleSequenceConfig
前者需要手动指定 workerId、datacenterId,可以结合数据库来使用,后者是利用网卡信息进行自适应。 推荐使用默认配置类,网卡mac地址可人为伪造,加之虚拟化的发展,其唯一性已经无法保证,有概率重复。
详情
| 字段名 | 释义 | 默认值 | | ---------------- | ------------------------------------------------------ | -------------- | | twepoch | 可以被设置为最接近项目启用前的某个时间点(unix 时间戳) | 1665817757000L | | workerIdBits | 机器位所占的bit位数 | 19L | | datacenterIdBits | 数据标识位所占的bit位数 | 0L | | sequenceBits | 毫秒内自增位数 | 3L | | workerId | 机器位 | | | datacenterId | 数据位 | 0L | | inetAddress | 网络相关信息 | |
生产推荐使用方式
- 依赖引入
${uid-generator.version}说明<dependency> <groupId>io.github.mocreates</groupId> <artifactId>uid-generator</artifactId> <version>${uid-generator.version}</version> </dependency> - 创建表
CREATE TABLE `worker_node` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `node_info` varchar(512) NOT NULL, `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `gmt_modify` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='DB WorkerID Assigner for UID Generator'; - 配置 (利用主键自增来分配workerId, 解决分布式环境下手动指定workerId的痛点)
@Bean public Sequence sequence(WorkerNodeMapper workerNodeMapper) throws UnknownHostException { WorkerNode workerNode = new WorkerNode(); InetAddress localHost = InetAddress.getLocalHost(); workerNode.setNodeInfo(localHost.toString()); workerNodeMapper.insertSelective(workerNode); DefaultSequenceConfig defaultSequenceConfig = new DefaultSequenceConfig(); defaultSequenceConfig.setWorkerId(workerNode.getId()); return new Sequence(defaultSequenceConfig); } - 使用序列器生成ID
@Autowired private Sequence sequence; public long generateId() { return sequence.nextId(); }
JMH 性能测试
测试机硬件情况
MacBook Pro (13-inch, M1, 2020) 8C 16G
Sequence 配置参数
private static final DefaultSequenceConfig SEQUENCE_CONFIG = new DefaultSequenceConfig();
static {
SEQUENCE_CONFIG.setSequenceBits(22);
SEQUENCE_CONFIG.setWorkerIdBits(0);
SEQUENCE_CONFIG.setDatacenterIdBits(0);
SEQUENCE_CONFIG.setTwepoch(System.currentTimeMillis());
SEQUENCE_CONFIG.setWorkerId(0L);
SEQUENCE_CONFIG.setDatacenterId(0L);
}
private static final Sequence SEQUENCE = new Sequence(SEQUENCE_CONFIG);
JMH参数
@BenchmarkMode(Mode.Throughput)
@Threads(10)
@Warmup(iterations = 3, time = 10, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 10, time = 10, timeUnit = TimeUnit.SECONDS)
@State(value = Scope.Benchmark)
@Fork(1)
@OutputTimeUnit(TimeUnit.SECONDS)
测试结果
| Benchmark | Mode | Cnt | Score | Error | Units | | --------------------------------- | ----- | ---- | ------------------------- | ----- | ----- | | SingleNodeSequenceTest.nextIdTest | thrpt | 10 | 27825573.565 ± 962298.054 | | ops/s |
版本说明
|uid-generator.version| jdk支持| | ---- | ---- | |3.0.1-RELEASE| >=21| |2.0-RELEASE | >=8|
