#id-generator #flake #ordered #generate #identifier #generated #128-bit

flaker

Flaker是一个用于Rust的flake实现。Flaker可以生成128位的有序ID,这些ID可以在多台机器/进程之间生成,但可以保证按字典顺序排序。

2个版本

使用旧的Rust 2015

0.1.3 2016年5月17日
0.1.2 2016年3月30日

#12 in #flake

Apache-2.0/MIT

10KB
95

flaker

Flaker是Rust的flake实现

这是什么?

flake是一个128位的k-有序ID - 它是实时有序的,并且以字典顺序存储。Flaker是从Boundary的flake实现以及作者之前在Rustflakes上的工作衍生而来 - 这是一个用于.NET的类似工具。

基本上 - 它是一个有序ID生成服务。

开发者不需要依赖于中心数据存储库来生成ID,而是可以在数据源处使用flaker实现ID生成器。

标识符

标识符以128位数字的形式生成

  • 64位时间戳,自创世纪以来(1970年1月1日)的毫秒数。
  • 48位工作标识符 - 通常这将是MAC地址,但你可以使用任何你想要的。
  • 16位序列号,当同一毫秒请求多个标识符时增加,当时钟前进时重置为0。

许可证

在以下任一许可证下授权:

由你选择。

问题

我应该怎么使用这个?

请参阅示例中的 bulk_generate.rs

更长一点

  • 将crate添加到 Cargo.toml
  • 告诉你的代码使用flaker:extern crate flaker
  • 创建一个新的flaker实例。
  • 调用 get_id() 来获取一个新的ID。

理想情况下,你将使用一个中心服务来生成ID - 最好是每个服务器实例一个。

我应该什么时候使用flaker?

我的数据库可以生成ID,对吧?

集中式ID生成器看起来很好,直到你在系统中拥有大量生成ID的参与者时——想想数百个服务器。大量参与者可能会压倒你的中心存储的ID生成能力。或者你可能不在乎存储中的间隙,只关心你有按时间顺序排列的唯一标识符。根据底层存储的实现,可能无法让数据库自行生成连续的标识符(Azure SQL Database的早期版本就有这个功能)。

我应该使用什么作为工作标识符?

我通常会获取第一个活动以太网适配器的MAC地址。只要你保证每个生成器都是唯一的,使用什么并不重要。如果你需要,你也可以获取CPU标识符的最后6个字节。

虽然机器标识符在分布式系统中应该相对没有意义,但这并不意味着我们不能使用任意指示符来在特定时间范围内区分工作节点。如果你担心MAC地址欺骗,那么你应该能够想出解决方案。

6个字节给你提供了很大的创意空间。我建议任意增加你存储在S3桶中的一个数字。在用完唯一值之前,你可以重新生成工作标识符281,474,976,710,656次。

但要注意时区!

flaker在生成ID时使用UTC。我不信任你将服务器时钟设置为UTC,所以我为你跳过了这一步。

谢谢

感谢

  • serprextime替换为std::time

依赖项

~400KB