NewId:跨节点工作且无冲突的顺序 id 生成器

21-10-07 banq

NewId 可用作嵌入式唯一 ID 生成器,可生成 128 位(16 字节)顺序 ID。

许多应用程序使用唯一标识符来标识数据记录。使用关系数据库 (RDBMS) 的应用程序的一种常见方法是将这些 ID 的生成委托给数据库 - 通过标识列 (MS-SQL) 或类似方式。这种方法适用于小型应用程序,但很快就会成为网络规模的瓶颈。请参阅来自 twitter 上的 blokes 的这篇文章,另一个用例是使用消息传递在它们之间进行通信的应用程序 - 基于微服务架构就是这种情况。这些应用程序可能需要消息的连续唯一 ID。

一种简单的方法是使用应用程序中生成的 GUID/UUID。虽然这有效,但在大多数框架中 GUID 不是连续的。这剥夺了根据记录的唯一 ID 对记录进行排序的能力。

Erlang 库 flake ( https://github.com/boundary/flake ) 采用了一种使用机器 MAC、时间戳和每个线程序列号生成 128 位 k 排序 id(按词法读取时间排序)的方法。这些 ID 是连续的,不会在运行使用这些作为 UUID 的应用程序的节点集群中发生冲突。

NewId id = NewId.Next(); //produces an id like {11790000-cf25-b808-dc58-08d367322210}

// Supports operations similar to GUID
NewId id = NewId.Next().ToString("D").ToUpperInvariant();
// Produces 11790000-CF25-B808-2365-08D36732603A

// Start from an id
NewId id = new NewId("11790000-cf25-b808-dc58-08d367322210");

// Start with a byte-array
var bytes = new byte[] { 16, 23, 54, 74, 21, 14, 75, 32, 44, 41, 31, 10, 11, 12, 86, 42 };
NewId theId = new NewId(bytes);

 

生成的 id 可以通过设计进行预测。在需要不可预测性的情况下,不应使用它们。这些 ID不应用于:

  • 生成密码
  • 安全令牌
  • 任何你不希望别人猜到的东西。

NewId 生成的 id 公开了生成 id 的机器的身份(通过其 MAC 地址)以及它生成的时间。对于某些对安全敏感的应用程序来说,这可能是一个问题。

点击标题

 

猜你喜欢