mysql 生成 uid_ecp-uid: 居于美团leaf、百度UidGenerator、原生snowflake 进行整合的 唯一ID生成器...

本文介绍了如何结合美团Leaf、百度UidGenerator和原生Snowflake算法,设计一个MySQL驱动的唯一ID生成器。内容包括workerId的多种提供策略,如DisposableWorkerIdAssigner(依赖数据库)、SimpleWorkerIdAssigner(固定workerId)、ZkWorkerIdAssigner(使用Zookeeper)和RedisWorkIdAssigner(使用Redis)。同时,详细说明了uid生成策略,如DefaultUidGenerator和CachedUidGenerator,并给出了比特分配的优化建议,以适应不同并发需求和重启频率的应用场景。
摘要由CSDN通过智能技术生成

(1)、workerId提供策略

* DisposableWorkerIdAssigner,利用数据库来管理生成workId,依赖数据库和spring-jdbc框架(需有jdbcTemplate的bean)。mysql表示例:

DROP TABLE IF EXISTS WORKER_NODE;

CREATE TABLE WORKER_NODE (

ID BIGINT NOT NULL AUTO_INCREMENT COMMENT '自增 id',

HOST_NAME VARCHAR(64) NOT NULL COMMENT '主机名',

PORT VARCHAR(64) NOT NULL COMMENT '端口',

TYPE INT NOT NULL COMMENT '节点类型: ACTUAL or CONTAINER',

LAUNCH_DATE DATE NOT NULL COMMENT '启动时间',

MODIFIED TIMESTAMP NOT NULL COMMENT '修改时间',

CREATED TIMESTAMP NOT NULL COMMENT '创建时间',

PRIMARY KEY(ID)

) COMMENT='DB WorkerID Assigner for UID Generator',ENGINE = INNODB;

示例:

...

* SimpleWorkerIdAssigner ,固定了workId的提供。值为0.示例:

* ZkWorkerIdAssigner ,利用zookeeper来实现wordId的提供管理,依赖了zk-client框架.示例:

可设置interval-心跳间隔、pidHome-workerId文件存储目录、zkAddress-zk地址、pidPort-心跳端口

* RedisWorkIdAssigner ,利用redis来实现wordId的提供管理,依赖了spring-data-redis框架的RedisTemplate.示例:

可设置interval-心跳间隔、pidHome-workerId文件存储目录、pidPort-心跳端口

(2)、uid生成策略

* DefaultUidGenerator 是Snowflake算法的变种,取消datacenterId, 并扩展了支持自定义workerId位数和初始化策略。

a、可配置 delta seconds (28 bits)

当前时间,相对于时间基点"2016-05-20"的增量值,单位:秒,最多可支持约8.7年

b、worker id (22 bits)

机器id,最多可支持约420w次机器启动。内置实现为在启动时由数据库分配,默认分配策略为用后即弃,后续可提供复用策略。

c、sequence (13 bits)

每秒下的并发序列,13 bits可支持每秒8192个并发。

注: 三者之和为63

示例:

* CachedUidGenerator借用未来时间来解决sequence天然存在的并发限制; 采用RingBuffer来缓存已生成的UID, 并行化UID的生产和消费,

同时对CacheLine补齐,避免了由RingBuffer带来的硬件级「伪共享」问题. 最终单机QPS可达600万

示例:

(3)、比特分配的建议

*对于并发数要求不高、期望长期使用的应用, 可增加```timeBits```位数, 减少```seqBits```位数.

例如节点采取用完即弃的WorkerIdAssigner策略, 重启频率为12次/天,

那么配置成```{"workerBits":23,"timeBits":31,"seqBits":9}```时, 可支持28个节点以整体并发量14400 UID/s的速度持续运行68年.

*对于节点重启频率频繁、期望长期使用的应用, 可增加```workerBits```和```timeBits```位数, 减少```seqBits```位数.

例如节点采取用完即弃的WorkerIdAssigner策略, 重启频率为24*12次/天,

那么配置成```{"workerBits":27,"timeBits":30,"seqBits":6}```时, 可支持37个节点以整体并发量2400 UID/s的速度持续运行34年.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值