1

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

 2 years ago
source link: https://www.jdon.com/57349
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
NewId:跨节点工作且无冲突的顺序 id 生成器

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 地址)以及它生成的时间。对于某些对安全敏感的应用程序来说,这可能是一个问题。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK