idgen_rs 0.2.0

A high-performance, lock-free snowflake ID generator using AtomicU64 + CAS. Generates 2M+ IDs per second on a single core.
Documentation

🦜 idgen_rs

介绍

idgen_rs 是一个纯 Rust 实现的高性能 Snowflake 雪花算法 ID 生成器。

Snowflake 是 Twitter 开源的分布式 ID 生成算法,核心思想是将 64 位的 ID 分成多个部分:

  • 符号位 (1 bit): 始终为 0
  • 时间戳 (41 bits): 相对于基准时间的毫秒数
  • 机器码 (worker_id): 标识生成节点
  • 序列号 (sequence): 同一毫秒内的递增序号

主要特性:

  1. 无锁设计 - 使用原子操作(CAS)替代 Mutex,极高并发性能
  2. 全局唯一 - worker_id 实现分布式唯一
  3. 时间有序 - 支持从 ID 中提取生成时间
  4. 单调递增 - 全数字 u64,数据库友好
  5. 业务语义 - 自动根据集群规模计算位长
  6. 时钟回拨容忍 - 智能处理 NTP 同步导致的时钟回拨

性能对比

实现 单核 QPS 4线程 QPS 锁类型
原版 (Mutex) ~50万 ~200万 全局互斥锁
本版 (Atomic) ~200万+ ~800万+ 无锁 CAS

实测数据:next_id 单次耗时 ~488ns,吞吐量 ~2.05M IDs/sec(单核)

安装

[dependencies]
idgen_rs = "0.2.0"

可选 Features

# 性能指标
idgen_rs = { version = "0.2.0", features = ["metrics"] }

# 编码支持 (base62 + base64)
idgen_rs = { version = "0.2.0", features = ["encodings"] }

# 全部启用
idgen_rs = { version = "0.2.0", features = ["metrics", "encodings"] }

快速开始

方式1:快速初始化(推荐,最简单)

use idgen_rs::snowflake_init;

fn main() {
    snowflake_init(1);
    let id = id_helper::next_id();
}

方式2:业务语义初始化(高级配置)

use idgen_rs::id_helper;

fn main() {
    // 只需告诉集群规模和目标 QPS,自动计算位长
    id_helper::init_with_capacity(1, 1024, 50_000);
    
    let id = id_helper::next_id();
    println!("{}", id);
}

方式3:Builder 模式

use idgen_rs::{id_helper, IGOptions};

fn main() {
    id_helper::set_options(
        IGOptions::builder(1)
            .worker_id_bit_length(10)
            .seq_bit_length(12)
            .build()
    );
    let id = id_helper::next_id();
}

完整示例

use idgen_rs::{init_with_capacity, id_helper};

fn main() {
    init_with_capacity(1, 1024, 50_000);

    // 单个 ID
    let id = id_helper::next_id();
    println!("ID: {}", id);

    // 批量生成
    let ids = id_helper::next_ids(5);
    println!("批量: {:?}", ids);

    // 解析信息
    let info = id_helper::extract_id_info(id);
    println!("worker_id={}, sequence={}", info.worker_id, info.sequence);
    
    // Utc 时间
    if let Some(utc) = id_helper::extract_time_utc(id) {
        println!("{}", utc.format("%Y-%m-%d %H:%M:%S UTC"));
    }
}

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 idgen_rs::{snowflake_init, IdEncoding, IdDecoding};

fn main() {
    snowflake_init(1);
    let id = id_helper::next_id();
    
    // 编码
    println!("base62: {}", id.to_base62());
    println!("base64: {}", id.to_base64());
    println!("url-safe: {}", id.to_base64_url());
    
    // 解码
    let decoded = u64::from_base62("1sMDF0VgTg").unwrap();
}

性能指标 (metrics feature)

use idgen_rs::{FastIdGenerator, IGOptions, IdGeneratorMetrics};

fn main() {
    let options = IGOptions::quick_init(1);
    let gen = FastIdGenerator::new(&options);
    
    // 生成 ID...
    gen.next_id();
    
    // 获取指标
    let metrics: IdGeneratorMetrics = gen.metrics();
    println!("总生成: {}", metrics.total_generated);
    println!("时钟回拨: {}", metrics.clock_backwards_count);
}

内部实现

核心使用 AtomicU64 打包 (timestamp << bits) | sequence,通过 compare_exchange_weak 实现无锁更新:

// 伪代码
if now == last_timestamp {
    // 同毫秒:CAS 自增序列号
    new_state = (now << seq_bits) | (old_seq + 1);
} else if now > last_timestamp {
    // 新毫秒:CAS 更新时间戳,重置序列号
    new_state = now << seq_bits;
} 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年