NewId:跨節點工作且無衝突的順序 id 生成器

banq發表於2021-10-07

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 地址)以及它生成的時間。對於某些對安全敏感的應用程式來說,這可能是一個問題。
點選標題
 

相關文章