当前位置 : 主页 > 编程语言 > java >

基于雪花算法实现增强版ID生成器详解

来源:互联网 收集:自由互联 发布时间:2023-01-30
目录 基于雪花算法的增强版ID生成器 快速开始 配置解析 目前提供两个配置类 详情 生产推荐使用方式 JMH 性能测试 测试机硬件情况 Sequence 配置参数 JMH参数 测试结果 Tip 基于雪花算法的
目录
  • 基于雪花算法的增强版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 时间戳)1665817757000LworkerIdBits机器位所占的bit位数19LdatacenterIdBits数据标识位所占的bit位数0LsequenceBits毫秒内自增位数3LworkerId机器位 datacenterId数据位0LinetAddress网络相关信息 

      生产推荐使用方式

      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)
      

      测试结果

      BenchmarkModeCntScoreErrorUnitsSingleNodeSequenceTest.nextIdTestthrpt1027825573.565 ± 962298.054 ops/s

      Tip

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

      仓库地址

      https://github.com/mocreates/sequence

      到此这篇关于基于雪花算法实现增强版ID生成器详解的文章就介绍到这了,更多相关雪花算法实现ID生成器内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!

      上一篇:Java中引用类型class的用法总结
      下一篇:没有了
      网友评论