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

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

  • 解決了時間回撥的問題
  • 無需手動指定workId, 微服務環境自適應
  • 可配置化
快速開始
  1. 依賴引入<dependency><groupId>io.github.mocreates</groupId><artifactId>uid-generator</artifactId><version>2.0-RELEASE</version></dependency>
  2. 配置序列器 Sequence
@Beanpublic Sequence sequence() {SequenceConfig sequenceConfig = new SimpleSequenceConfig();return new Sequence(sequenceConfig);}
  1. 使用序列器生成ID
@Autowiredprivate 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';
  1. 配置 (利用主鍵自增來分配workerId, 解決分布式環境下手動指定workerId的痛點)
@Beanpublic 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
@Autowiredprivate 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 = https://www.huyubaike.com/biancheng/Scope.Benchmark)@Fork(1)@OutputTimeUnit(TimeUnit.SECONDS)測試結果BenchmarkModeCntScoreErrorUnitsSingleNodeSequenceTest.nextIdTestthrpt1027825573.565 ± 962298.054ops/sTip如果對qps性能要求較高,可以適當調整sequenceBits
倉庫地址https://github.com/mocreates/sequence
【基于雪花算法的增強版ID生成器】

    推薦閱讀