Skip to content

mocreates/sequence

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

sequence

基于雪花算法的增强版ID生成器

  • 解决了时间回拨的问题
  • 无需手动指定workId, 微服务环境自适应
  • 可配置化

快速开始

  1. 依赖引入
    <dependency>
        <groupId>io.github.mocreates</groupId>
        <artifactId>uid-generator</artifactId>
        <version>2.0-RELEASE</version>
    </dependency>
    
  2. 配置序列器 Sequence
    @Bean
    public Sequence sequence() {
        SequenceConfig sequenceConfig = new SimpleSequenceConfig();
        return new Sequence(sequenceConfig);
    }
  1. 使用序列器生成ID
    @Autowired
    private Sequence sequence;
    
    public long generateId() {
        return sequence.nextId();
    }

配置解析

目前提供两个配置类

  • io.github.mocreates.config.DefaultSequenceConfig
  • io.github.mocreates.config.SimpleSequenceConfig

前者需要手动指定 workerId、datacenterId,可以结合数据库来使用,后者是利用网卡信息进行自适应。 推荐使用默认配置类,网卡mac地址可人为伪造,加之虚拟化的发展,其唯一性已经无法保证,有概率重复。

详情

字段名 释义 默认值
twepoch 可以被设置为最接近项目启用前的某个时间点(unix 时间戳) 1665817757000L
workerIdBits 机器位所占的bit位数 19L
datacenterIdBits 数据标识位所占的bit位数 0L
sequenceBits 毫秒内自增位数 3L
workerId 机器位
datacenterId 数据位 0L
inetAddress 网络相关信息

生产推荐使用方式

  1. 依赖引入
    <dependency>
        <groupId>io.github.mocreates</groupId>
        <artifactId>uid-generator</artifactId>
        <version>2.0-RELEASE</version>
    </dependency>
    
  2. 创建表
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';
  1. 配置 (利用主键自增来分配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);
    }
  1. 使用序列器生成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

About

Id generator based on snowflake algorithm with stronger capability.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages