開源項目|Go 開發的一款分佈式唯一 ID 生成系統

原文連接: 開源項目|Go 開發的一款分佈式唯一 ID 生成系統

今天跟大家介紹一個開源項目:id-maker,主要功能是用來在分佈式環境下生成唯一 ID。上週停更了一週,也是用來開發和測試這個項目的相關代碼。

美團有一個開源項目叫 Leaf,使用 Java 開發。本項目就是在此思路的基礎上,使用 Go 開發實現的。

項目整體代碼量並不多,不管是想要在實際生產環境中使用,還是想找個項目練手,我覺得都是一個不錯的選擇。

項目背景

在大部分系統中,全局唯一 ID 都是一個強需求。比如快遞,外賣,電影等,都需要生成唯一 ID 來保證單號唯一。

那業務系統對 ID 號的要求有哪些呢?

  1. 全局唯一性:不能出現重複的 ID 號,既然是唯一標識,這是最基本的要求。
  2. 趨勢遞增:在 MySQL InnoDB 引擎中使用的是聚集索引,由於多數 RDBMS 使用 B-tree 的數據結構來存儲索引數據,在主鍵的選擇上面我們應該儘量使用有序的主鍵保證寫入性能。
  3. 單調遞增:保證下一個 ID 一定大於上一個 ID,例如事務版本號、IM 增量消息、排序等特殊需求。
  4. 信息安全:如果 ID 是連續的,惡意用戶的扒取工作就非常容易做了,直接按照順序下載指定 URL 即可;如果是訂單號就更危險了,競對可以直接知道我們一天的單量。所以在一些應用場景下,會需要 ID 無規則、不規則。

在此背景下,有一個高可用的唯一 ID 生成系統就很重要了。

項目使用

生成 ID 分兩種方式:

  1. 根據數據庫生成 ID。
  2. 根據雪花算法生成 ID。

使用上提供兩種方式來調用接口:

  1. HTTP 方式
  2. gRPC 方式

HTTP 方式

1、健康檢查:

curl http://127.0.0.1:8080/ping

2、獲取 ID:

獲取 tag 是 test 的 ID:

curl http://127.0.0.1:8080/v1/id/test

3、獲取雪花 ID:

curl http://127.0.0.1:8080/v1/snowid

gRPC 方式

1、獲取 ID:

grpcurl -plaintext -d '{"tag":"test"}' -import-path $HOME/src/id-maker/internal/controller/rpc/proto -proto segment.proto localhost:50051 proto.Gid/GetId

2、獲取雪花 ID:

grpcurl -plaintext -import-path $HOME/src/id-maker/internal/controller/rpc/proto -proto segment.proto localhost:50051 proto.Gid/GetSnowId

本地開發

# Run MySQL
$ make compose-up

# Run app with migrations
$ make run

項目架構

項目使用 go-clean-template 架構模板開發,目錄結構如下:

下面對各目錄做一個簡要說明:

  • cmd:程序入口
  • config:配置文件
  • docs:生成的項目文檔
  • integration-test:整合測試
  • internal:業務代碼
  • pkg:一些調用的包

借用官方的兩張圖:

整體的層次關係是這樣的,最裏面是 models,定義我們的表結構,然後中間是業務邏輯層,業務邏輯層會提供接口,給最外層的 API 來調用,最外層就是一些工具和調用入口。

這樣做的最大好處就是解耦,不管最外層如何變化,只要在業務邏輯層實現對應接口即可,核心代碼可能根本不需要改變。

所以,它們之間的調用關係看起來是這樣的:

HTTP > usecase
       usecase > repository (Postgres)
       usecase < repository (Postgres)
HTTP < usecase

以上就是本項目的全部內容,如果大家感興趣的話,歡迎給我留言交流,要是能給個 star 那就太好了。


項目地址:id-maker

往期文章:

推薦閱讀:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章