Giter Site home page Giter Site logo

svnlab / easy-sequence Goto Github PK

View Code? Open in Web Editor NEW

This project forked from openquartz/easy-sequence

0.0 0.0 0.0 142 KB

Integrate multiple high-performance distributed ID implementation methods, supporting one click switching to various implementations; Supports high-performance distributed sequence number generation. Simpler and more elegant to use.(集成多种高性能分布式ID实现方式,支持一键切换到各种实现; 支持高性能分布式序列号生成。使用更加简单,优雅。)

License: Apache License 2.0

Java 100.00%

easy-sequence's Introduction

EasySequence 序列生成器


分布式ID


代码入口

package com.openquartz.sequence.core.uid;

/**
 * @author svnee
 **/
public interface UidProvider {

    /**
     * nextId
     *
     * @return id
     */
    long nextId();

    /**
     * nextId
     *
     * @param key biz-key
     * @return key
     */
    long nextId(String key);

    /**
     * 反解析uid
     *
     * @param uid uid
     * @return 解析结果
     */
    default String parseUid(long uid) {
        return String.valueOf(uid);
    }

    /**
     * 反解析uid
     *
     * @param key key
     * @param uid uid
     * @return 解析结果
     */
    default String parseUid(String key, long uid) {
        return String.valueOf(uid);
    }
}

类关系图

UidProvider

雪花ID

雪花算法分布式ID生成。入口:com.openquartz.sequence.core.uid.snowflake.SnowflakeIdProvider.nextId() 如果开启了雪花算法,可以直接从工厂中取出。

开启雪花算法easysequence.uid.snowflake.enabled=true

easysequence.uid.snowflake.enabled=true
easysequence.uid.snowflake.type=cache
easysequence.uid.snowflake.worker-id.min=0
easysequence.uid.snowflake.worker-id.max=32
easysequence.uid.snowflake.worker-id.default-val=0
easysequence.uid.snowflake.default-group=default

雪花算法目前支持两种算法实现。

1、标准版本;

2、Cache模式 采用百度的 UidGenerator 实现

相较于标准版本的实现CacheUidGenerator 性能更高。 具体的选择可以自己根据实际场景进行切换选择。用户可以实现一键配置easysequence.uid.snowflake.type自定义切换。

default: 表示标准版本;cache: 表示百度的CacheUidGenerator实现。

  • 1、标准模式 使用dataCenterId+workerId 模式构成。所以最大workerId范围在[0,32)。用户也可在这个范围内进行缩小
  • 2、Cache模式workerId 使用 workerId模式构成。workerId最大范围在[0,1024)

目前雪花算法的workerId 支持三种分配方式:随机分配Zookeeper分配DB分配

随机分配

设置配置:easysequence.uid.snowflake.worker-assigner-type=random

不支持不重复

Zookeeper分配

需要设置配置 easysequence.uid.snowflake.worker-assigner-type=zookeeper 同时 需要依赖Zookeeper组件.需要引入相关依赖

easysequence.uid.snowflake.zookeeper.url=
easysequence.uid.snowflake.zookeeper.worker-heartbeat-interval=3000
easysequence.uid.snowflake.zookeeper.worker-pid-port=-1
easysequence.uid.snowflake.zookeeper.worker-pid-home=/data/pids/

DB 分配(推荐)

支持使用Jdbc等的关系型数据库。

DB分配实现基于LOOP模式的下的分配。以当前机器IP下优先准则,其次依次LOOP进行分配workerId

需要设置easysequence.uid.snowflake.worker-assigner-type=db 配置

easysequence.uid.snowflake.db.worker-expire-interval=5000
easysequence.uid.snowflake.db.worker-heartbeat-interval=50000

同时执行SQL:

CREATE TABLE `es_snowflake_worker_node`
(
    `id`               bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
    `group`            varchar(50) NOT NULL DEFAULT '' COMMENT 'group',
    `worker_id`        int(5) NOT NULL DEFAULT 0 COMMENT 'workerId',
    `uid`              varchar(50) NOT NULL DEFAULT '' COMMENT '本次启动唯一id',
    `process_id`       varchar(50) NOT NULL DEFAULT '' COMMENT '进程ID',
    `ip`               varchar(50) NOT NULL DEFAULT '' COMMENT 'ip address',
    `last_expire_time` timestamp   NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '下次失效时间',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uniq_group_worker` (`group`,`worker_id`),
    UNIQUE KEY `uniq_group_ip` (`group`,`ip`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='雪花算法WorkNode';

LeafID

基于MeituanLeafId 的实现。可是自动装配。更好的集成到项目中。默认不开启。 如需开启可以启用配置

easysequence.uid.leaf.enabled=true
easysequence.uid.leaf.default-key=leaf-segment-test

并且设置默认的key.

需要执行SQL

CREATE TABLE `es_leaf_alloc`
(
    `biz_tag`     varchar(128) NOT NULL DEFAULT '',
    `max_id`      bigint(20) NOT NULL DEFAULT 1,
    `step`        int(11) NOT NULL,
    `description` varchar(256)          DEFAULT NULL,
    `update_time` timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`biz_tag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='LeafId分配';

并且配置默认的分组key.

使用LeafId入口方法为com.openquartz.sequence.core.uid.leaf.LeafIdGenerator

自定义序列号


环境配置

1、执行SQL脚本

CREATE TABLE es_sequence_assign_register
(
    id            INT (11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
    register_code VARCHAR(50) NOT NULL DEFAULT '' COMMENT '注册码',
    register_desc VARCHAR(50) NOT NULL DEFAULT '' COMMENT '描述',
    `cycle`       INT (11) NOT NULL DEFAULT -1 COMMENT '周期',
    cycle_unit    VARCHAR(50) NOT NULL DEFAULT '' COMMENT '周期单位',
    init_value    BIGINT (20) NOT NULL DEFAULT -1 COMMENT '初始值',
    create_time   TIMESTAMP   NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    update_time   TIMESTAMP   NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '序列号注册器';

CREATE TABLE es_sequence_next_assign
(
    id               BIGINT (20) NOT NULL AUTO_INCREMENT COMMENT 'id',
    unique_key       VARCHAR(50) NOT NULL DEFAULT '' COMMENT '唯一key',
    next_value       BIGINT (15) NOT NULL DEFAULT -1 COMMENT '下一次值',
    last_assign_time DATETIME    NOT NULL COMMENT '下一次生成时间',
    `cycle`          INT (10) NOT NULL DEFAULT -1 COMMENT '循环',
    cycle_unit       VARCHAR(50) NOT NULL DEFAULT '' COMMENT '循环单位',
    init_value       BIGINT (20) NOT NULL DEFAULT -1 COMMENT '初始值',
    PRIMARY KEY (id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '序列下一次生成';

CREATE TABLE es_sequence_template
(
    id            BIGINT (20) NOT NULL AUTO_INCREMENT COMMENT 'id',
    register_code VARCHAR(50)  NOT NULL DEFAULT '' COMMENT '唯一key',
    `expression`  varchar(512) NOT NULL DEFAULT '' COMMENT '表达式',
    PRIMARY KEY (id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '序列号生成模板';

2、配置数据源链接

easysequence:
    datasource:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/easysequence?characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8
        username: root
        password: 123456

使用

1、配置表达式

表达式支持串接、嵌套。 多个表达式使用{ }进行分隔

表达式分类
常量

语法:{const 固定常量前缀}

时间

语法:{time 时间格式}

时间格式目前支持:yyyyMMddHHmmss

序列

语法:{seq 序列号标识} 需要配置到:es_sequence_assign_register

长度补齐

语法:{fix 字符串 补齐长度 填充字符}

自定义环境参数传递

语法:{env 环境标识}

例如:{const DEMO}{fix {env w} 4}{time yyyyMMdd}{fix {seq DEMO_GENERATOR {env w}} 5}

随机字母字符串

语法:{rand_c 长度 随机范围类型} 随机范围类型可选值为:type1,type2,type3,type4

type1: 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' `

type2: 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'

type3: 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'

type4: '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'

随机数字字符串

语法:{rand_n 长度}

2、使用表达式

使用序列号生成代码入口:com.openquartz.sequence.core.expr.SequenceGenerateService

3、启用序列池

由于性能考虑不会每次都从DB中加载,做了池化缓存一定的序列。可以配置启用或关闭。 针对不同的序列的注册码的缓存的数量可以自定义配置。也可以直接配置对应的默认配置

###sequence-pool
easysequence.sequence.pool.enable=true
easysequence.sequence.pool.wait-fetch-timeout=5000
easysequence.sequence.pool.default-property.pre-count=50
easysequence.sequence.pool.default-property.water-level-threshold=5
easysequence.sequence.pool.custom-property.TEST1.pre-count=50
easysequence.sequence.pool.custom-property.TEST1.water-level-threshold=5

easy-sequence's People

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.