」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 實作雪花 ID 產生器

實作雪花 ID 產生器

發佈於2024-11-07
瀏覽:443

Implementing Snowflake Id generator

什麼是雪花 ID?

雪花 ID 在分散式環境中用於產生無衝突、簡短、唯一的 ID。與依賴資料庫產生 ID 或使用長 128 位元 UUID 等傳統方法不同,Snowflake ID 使用時間和簡單的位元運算。這種巧妙的技術允許每個微服務獨立產生唯一的 ID,而不需要中央系統來避免衝突。

如何產生一個

產生雪花 ID 就像用三個關鍵部分建立拼圖一樣。讓我們來分解一下:

  1. 取一個n位長的位串:

    首先,我們從長度為 n 的位元串開始。這將保存產生唯一 ID 所需的所有資訊。

  2. 分為三段:i、j、k:

    位元串分為三個部分,使得 i j k = n.

  • i - 時間組件:

    第一部分 i 表示當前時間。選擇一個固定的開始時間(也稱為紀元),i 的位元將透過以奈秒為單位的當前時間減去開始時間來計算。這可確保新的 ID 始終大於舊的 ID。

  • j - 機器 ID:

    第二部分 j 是機器識別碼。當你的微服務啟動時,它會被分配一個唯一的ID(機器ID),它成為j部分。這可以確保不同機器產生的 ID 不會發生衝突,即使它們是在完全相同的時刻創建的。

  • k - 序號:

    最後一部分 k 是序號。它的作用就像一個計數器,只要在同一時間單位內產生多個 ID,該計數器就會增加。這可以保持 ID 的唯一性,即使它們是快速連續生成的。

  1. 組合各部分: 獲得 i、j 和 k 值後,將它們連接起來形成單位元字串。然後,將此位元字串轉換為基數 10,以獲得最終的 Snowflake ID。

一個簡單的類比

將雪花 ID 視為繁忙廚房中的特殊菜餚標籤:

  • 時間(i):這就像廚房裡的時鐘滴答作響,確保稍後準備的菜餚比之前製作的菜餚數量更多。
  • 機器 ID (j):每個廚師(或微服務)都有自己的簽名,確保他們的菜餚標籤不會與其他人的衝突。
  • 序號(k):如果廚師在一瞬間做了多道菜,他們會在標籤上添加一個微小的增量,因此每道菜都有一個唯一的標籤。

Go 中實現的雪花

查看此 GitHub 儲存庫,以了解 Snowflake ID 產生的 Go 實作

來源

  1. https://blog.x.com/engineering/en_us/a/2010/announcing-snowflake
  2. https://en.wikipedia.org/wiki/Snowflake_ID
版本聲明 本文轉載於:https://dev.to/alquama/implementing-snowflake-id-generator-3f8k?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3