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


    sequence

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

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

    快速开始

    1. 依赖引入
      <dependency>
          <groupId>io.github.mocreatesgroupId>
          <artifactId>uid-generatorartifactId>
          <version>2.0-RELEASEversion>
      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,可以结合数据库来使用,后者是利用网卡信息进行自适应

    详情

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

    生产推荐使用方式

    1. 依赖引入
      <dependency>
          <groupId>io.github.mocreatesgroupId>
          <artifactId>uid-generatorartifactId>
          <version>2.0-RELEASEversion>
      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

    Tip

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

    仓库地址

    https://github.com/mocreates/sequence

  • 相关阅读:
    LeetCode --- 2047. Number of Valid Words in a Sentence 解题报告
    uni-app 页面跳转动画
    man 命令的结构和含义
    【回溯】组合
    第十章:C语言的调试
    muduo网络库编程
    【图片+代码】:GCC 链接过程中的【重定位】过程分析
    敏感词检测库ToolGood.Words中 WordsHelper类使用简介
    Linux 15:基于C/S架构——微云盘
    《Linux C/C++服务器开发实践》之第5章 UDP服务器编程
  • 原文地址:https://www.cnblogs.com/think-in-java/p/16797882.html