2 个版本
0.1.1 | 2021 年 8 月 7 日 |
---|---|
0.1.0 | 2021 年 8 月 7 日 |
#11 in #distributed-id
31KB
547 代码行数(不含注释)
Infallible-SonyFlake
受 Twitter 的 Snowflake 启发的分布式唯一 ID 生成器。
这是原始的 sony/sonyflake 的 Rust 实现,后者是用 Go 编写的。
英语 | 简体中文
索尼碎片 ID 由以下组成
39 bits for time in units of 10 msec
8 bits for a sequence number
16 bits for a machine id
安装
将以下内容添加到您的 Cargo.toml
[dependencies]
infallible-sonyflake = "0.1"
快速入门
- 可出错的索尼碎片
Sonyflake
在调用next_id
时如果时间溢出,可能会无法生成唯一的 ID。use infallible_sonyflake::{SonyFlake, Settings}; use chrono::Utc; fn main() { let now = Utc::now(); let mut sf = Settings::new().set_start_time(now).into_sonyflake().unwrap(); let next_id = sf.next_id().unwrap(); println!("{}", next_id); }
- 不可出错的索尼碎片
InfaillibleSonyFlake
如果发生时间溢出,则在调用next_id
时始终生成唯一的 ID,它将start_time
更新为当前时间。use infallible_sonyflake::{InfallibleSonyFlake, Settings}; use chrono::Utc; fn main() { let now = Utc::now(); let mut sf = Settings::new().set_start_time(now).into_infallible_sonyflake().unwrap(); let next_id = sf.next_id(); println!("{}", next_id); }
- 自定义机器 ID 和机器 ID 检查器
use infallible_sonyflake::{InfallibleSonyFlake, Settings, MachineID, MachineIDChecker, IDParts, Error}; use chrono::Utc; struct CustomMachineID { counter: u64, id: u16, } impl MachineID for CustomMachineID { fn machine_id(&mut self) -> Result<u16, Box<dyn std::error::Error + Send + Sync + 'static>> { self.counter += 1; if self.counter % 2 != 0 { Ok(self.id) } else { Err(Box::new("NaN".parse::<u32>().unwrap_err())) } } } struct CustomMachineIDChecker; impl MachineIDChecker for CustomMachineIDChecker { fn check_machine_id(&self, id: u16) -> bool { if id % 2 != 0 { true } else { false } } } fn main() { let mut sf = Settings::new() .set_machine_id(Box::new(CustomMachineID { counter: 0, id: 1 })) .set_check_machine_id(Box::new(CustomMachineIDChecker {})) .into_infallible_sonyflake().unwrap(); let id = sf.next_id(); let parts = IDParts::decompose(id); assert_eq!(parts.get_machine_id(), 1); let err = Settings::new() .set_machine_id(Box::new(CustomMachineID { counter: 0, id: 2 })) .set_check_machine_id(Box::new(CustomMachineIDChecker {})) .into_infallible_sonyflake().unwrap_err(); assert_eq!(format!("{}", err), Error::InvalidMachineID(2).to_string()); }
依赖
~5.5–7.5MB
~134K SLoC