5个版本 (3个重大更新)

0.4.0 2022年5月8日
0.3.0 2022年5月6日
0.2.1 2017年2月20日
0.2.0 2017年2月20日
0.1.0 2017年2月16日

#659 in 编码

MIT 许可证

26KB
496

frostflake

Crates.io

可定制且线程安全的分布式ID生成器,类似于twitter的 snowflake

单实例生成器的简单使用

use frostflake::{Generator, GeneratorOptions};

let mut generator = Generator::new(GeneratorOptions::default());

let id1 = generator.generate();
let id2 = generator.generate();
let id3 = generator.generate();

异步生成器与tokio兼容

这需要 tokio 功能。

use frostflake::{GeneratorAsync, GeneratorOptions};

#[tokio::main]
async fn main() {
    let generator = GeneratorAsync::spawn(GeneratorOptions::default());

    let id1 = generator.generate().await.unwrap();
}

GeneratorAsyncSend,因此您可以安全地将它传递到其他线程或任务。

use frostflake::{GeneratorAsync, GeneratorOptions};

#[tokio::main]
async fn main() {
    let g = GeneratorAsync::spawn(GeneratorOptions::default());
    for _ in 0..10 {
        let g = g.clone();
        tokio::spawn(async move {
            let id = g.generate().await.unwrap();
        });
    }
}

通过GeneratorPool的多线程生成器

这需要 std-thread 功能。

use frostflake::{GeneratorPool, GeneratorPoolOptions};
use std::thread;

// create 10 generators
let pool = GeneratorPool::new(10, GeneratorPoolOptions::default());

{
    // pool also can be shared with threads by std::sync::Arc
    let pool = pool.clone();
    thread::spawn(move || {
        let id = pool.generate();
    }).join();
}

配置

frostflake 可高度配置。

use frostflake::{Generator, GeneratorOptions};

let opts = GeneratorOptions::default()
    .bits(42, 10, 12)           // 42bit timestamp, 10bit node, 12bit sequence
    .base_ts(1483228800000)     // base time 2017-01-01T00:00:00Z as milliseonds
    .node(3);                   // node number

let generator = Generator::new(opts);

此外,还可以设置时间函数。如果您想使用普通的秒为单位而不是毫秒,可以通过以下方式实现:

use frostflake::{Generator, GeneratorOptions};
use std::time::{SystemTime, UNIX_EPOCH};

fn my_time() -> u64 {
    let t = SystemTime::now().duration_since(UNIX_EPOCH).unwrap();
    t.as_secs()
}

// use smaller time bits (because this is not milliseconds)
// use larger sequence bits
let opts = GeneratorOptions::default()
    .base_ts(0) // need this for avoid exceeding time value on smaller bit size
    .bits(36, 10, 18)
    .base_ts(1483228800) // base time should be second too
    .time_fn(my_time); // set my time function

let generator = Generator::new(opts);

默认配置

生成器

选项 默认值
bits 42=时间戳, 10=节点, 12=序列
base_ts 1483228800000 (2017-01-01T00:00:00Z 作为毫秒)
node 0
time_fn 返回当前毫秒

GeneratorPool

几乎与Generator相同,但GeneratorPool使用 pool_id 位来区分每个池。

因此,默认的位数是

选项 默认值
bits 42=时间戳, 4=池ID, 6=节点, 12=序列

所有其他选项与Generator相同。

待办事项

  • 支持基于redis的自动node_id生成,类似于 katsubushi
  • 支持其他异步运行时?

欢迎提交补丁或pull请求。

依赖关系

~0–0.8MB
~12K SLoC