3 个版本

0.1.3 2022年7月16日
0.1.2 2022年7月15日
0.1.1 2022年7月14日
0.1.0 2022年7月14日

834开发工具

MIT 许可证

25KB
432

rid

Crate API License

基于 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 长度自定义

设计

快速入门

步骤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