3 个版本
0.1.3 | 2022年7月16日 |
---|---|
0.1.2 | 2022年7月15日 |
0.1.1 | 2022年7月14日 |
0.1.0 |
|
834 在 开发工具 中
25KB
432 行
rid
基于 Rust 的实用分布式 ID 生成器,基于 Snowflake 的唯一 ID 生成器。它作为一个组件使用,允许用户重写工作 ID 位和初始化策略。因此,它非常适合虚拟化环境,如 docker。
Snowflake
Snowflake 算法: 一个唯一 ID 由工作节点、时间戳和该时间戳内的序列组成。通常,它是一个 64 位的数字(long),这三个字段的默认位数为以下:
+------+----------------------+----------------+-----------+
| sign | delta seconds | worker node id | sequence |
+------+----------------------+----------------+-----------+
1bit 30bits 20bits 13bits
符号(1位) 最高位始终为 0。
delta seconds (30位) 下一个 30 位,代表自客户纪元(2016-05-20)以来的秒数增量。最大时间为 34 年。
worker id (20位) 下一个 20 位,代表工作节点 ID,最大值为 1.04 百万。UidGenerator 默认使用内置数据库的工作节点 ID 分配器,并在启动时使用,重启后会重用之前的工作节点 ID。
sequence (13位) 最后 13 位,代表一秒内的序列,默认情况下每秒(每台服务器)最大为 8192。
特性
- 轻量级且易于使用
- 本地生成分布式 ID,而不是通过服务或 RPC
- 工作 ID 持久化解决方案(在数据库如 mysql 中,而不是缓存存储中)
- 支持时钟向后移动(可以禁用)
- 支持小于 64 位的 ID 长度自定义
设计
- 参考百度 uid-generator
快速入门
步骤1:安装 rust,Mysql
步骤2:创建 worker_node 表
DROP TABLE IF EXISTS `worker_node`;
CREATE TABLE `worker_node` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'auto increment id',
`host_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'host name',
`port` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'port',
`worker_type` int NOT NULL COMMENT 'node type: CONTAINER(1), ACTUAL(2), FAKE(3)',
`modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'modified time',
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'created time',
PRIMARY KEY (`id`),
UNIQUE KEY `UNIQ_IDX_HOST_PORT` (`host_name`,`port`) USING BTREE COMMENT 'host和端口的唯一索引'
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='DB WorkerID Assigner for UID Generator';
步骤3:安装 Lib
将以下内容添加到您的 Cargo.toml 中
[dependencies]
rust-distributed-id = "0.1.2"
步骤4:使用
let config = rid_config::UidConfig::new("5000".to_string());
let rb: Rbatis = Rbatis::new();
rb.link("mysql://root:[email protected]:3306/test")
.await
.expect("Couldn't open database");
let mut idg = rid_generator::UidGenerator::new(&config, Arc::new(rb)).await;
let start = Local::now().timestamp_millis();
for _ in 1..10000 {
//println!("{}", &idg.get_uid());
let _ = idg.get_uid();
}
定制
将 'UidConfig' 中的 time_bits、worker_bits、seq_bits 更改为您的自定义 uid,特别是更短的 uid。
let mut config = rid_config::UidConfig::new("5000".to_string());
config.worker_bits = 10;
config.seq_bits = 23;
let rb: Rbatis = Rbatis::new();
rb.link("mysql://root:[email protected]:3306/test")
.await
.expect("Couldn't open database");
let mut idg = rid_generator::UidGenerator::new(&config, Arc::new(rb)).await;
let start = Local::now().timestamp_millis();
for _ in 1..1000000 {
//println!("{}", &idg.get_uid());
let _ = idg.get_uid();
}
变更日志
许可证
rid 是 MIT 许可。
依赖关系
~26–39MB
~768K SLoC