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 编码
26KB
496 行
frostflake
可定制且线程安全的分布式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();
}
GeneratorAsync
是 Send
,因此您可以安全地将它传递到其他线程或任务。
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