🦜 idgen_rs
介绍
idgen_rs 是一个纯 Rust 实现的高性能 Snowflake 雪花算法 ID 生成器。
Snowflake 是 Twitter 开源的分布式 ID 生成算法,核心思想是将 64 位的 ID 分成多个部分:
- 符号位 (1 bit): 始终为 0
- 时间戳 (41 bits): 相对于基准时间的毫秒数
- 机器码 (worker_id): 标识生成节点
- 序列号 (sequence): 同一毫秒内的递增序号
主要特性:
- 无锁设计 - 使用原子操作(CAS)替代 Mutex,极高并发性能
- 全局唯一 - worker_id 实现分布式唯一
- 时间有序 - 支持从 ID 中提取生成时间
- 单调递增 - 全数字 u64,数据库友好
- 业务语义 - 自动根据集群规模计算位长
- 时钟回拨容忍 - 智能处理 NTP 同步导致的时钟回拨
性能对比
| 实现 | 单核 QPS | 4线程 QPS | 锁类型 |
|---|---|---|---|
| 原版 (Mutex) | ~50万 | ~200万 | 全局互斥锁 |
| 本版 (Atomic) | ~200万+ | ~800万+ | 无锁 CAS |
实测数据:
next_id单次耗时 ~488ns,吞吐量 ~2.05M IDs/sec(单核)
安装
[]
= "0.2.0"
可选 Features
# 性能指标
= { = "0.2.0", = ["metrics"] }
# 编码支持 (base62 + base64)
= { = "0.2.0", = ["encodings"] }
# 全部启用
= { = "0.2.0", = ["metrics", "encodings"] }
快速开始
方式1:快速初始化(推荐,最简单)
use snowflake_init;
方式2:业务语义初始化(高级配置)
use id_helper;
方式3:Builder 模式
use ;
完整示例
use ;
API 列表
| 函数 | 说明 |
|---|---|
init_with_capacity(worker_id, max_nodes, max_qps) |
业务语义初始化(推荐) |
snowflake_init(worker_id) |
快速初始化 |
set_options(options) |
设置选项 |
get_options() |
获取配置 |
is_initialized() |
检查是否已初始化 |
next_id() |
生成单个 ID(零锁) |
try_next_id() |
生成 ID,返回 Result |
next_ids(count) |
批量生成 ID |
extract_time(id) |
提取 SystemTime |
extract_time_utc(id) |
提取 DateTime (返回 Option) |
extract_id_info(id) |
解析 ID 完整信息 |
extract_id_infos(ids) |
批量解析 |
编码支持 (encodings feature)
use ;
性能指标 (metrics feature)
use ;
内部实现
核心使用 AtomicU64 打包 (timestamp << bits) | sequence,通过 compare_exchange_weak 实现无锁更新:
// 伪代码
if now == last_timestamp else if now > last_timestamp else
容量对照表
| max_nodes | max_qps | worker_bits | seq_bits | 可用年限 |
|---|---|---|---|---|
| 64 | 10,000 | 6 | 5 | ~69年 |
| 1024 | 50,000 | 10 | 6 | ~68年 |
| 4096 | 200,000 | 12 | 9 | ~67年 |