目录
  • 基于雪花算法的增强版ID生成器
    • 快速开始
  • 配置解析
    • 目前提供两个配置类
    • 详情
  • 生产推荐使用方式
    • JMH 性能测试
      • 测试机硬件情况
      • Sequence 配置参数
      • JMH参数
      • 测试结果
    • Tip

      基于雪花算法的增强版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);
          }
      

      3.使用序列器生成ID

          @Autowired
          private Sequence sequence;
          
          public long generateId() {
              return sequence.nextId();
          }
      

      配置解析

      目前提供两个配置类

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

      前者需要显式地指定 workerId、datacenterId,可以结合数据库来使用,后者是利用网卡信息进行自适应

      详情

      字段名 释义 默认值
      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';
      

      3.配置 (利用主键自增来分配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);
          }
      

      4.使用序列器生成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

      Tip

      如果对qps性能要求较高,可以适当调整sequenceBits

      仓库地址

      https://github.com/mocreates/sequence

      声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。