日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Go開發(fā)的一款分布式唯一ID生成系統(tǒng)

GO 開發(fā)的一款分布式唯一 ID 生成系統(tǒng)

作者: yongxinz 2021-11-08 19:25:37

開發(fā)

后端

分布式 項目整體代碼量并不多,不管是想要在實際生產(chǎn)環(huán)境中使用,還是想找個項目練手,我覺得都是一個不錯的選擇。

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

美團有一個開源項目叫 Leaf,使用 Java 開發(fā)。本項目就是在此思路的基礎(chǔ)上,使用 Go 開發(fā)實現(xiàn)的。

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

項目背景

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

那業(yè)務系統(tǒng)對 ID 號的要求有哪些呢?

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

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

項目使用

生成 ID 分兩種方式:

  • 根據(jù)數(shù)據(jù)庫生成 ID。
  • 根據(jù)雪花算法生成 ID。

使用上提供兩種方式來調(diào)用接口:

  • HTTP 方式
  • gRPC 方式

HTTP 方式

1、健康檢查:

  
 
 
 
  1. curl http://127.0.0.1:8080/ping 

2、獲取 ID:

獲取 tag 是 test 的 ID:

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

3、獲取雪花 ID:

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

gRPC 方式

1、獲取 ID:

  
 
 
 
  1. 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:

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

本地開發(fā)

  
 
 
 
  1. # Run MySQL 
  2. $ make compose-up 
  3.  
  4. # Run app with migrations 
  5. $ make run 

項目架構(gòu)

項目使用 go-clean-template 架構(gòu)模板開發(fā),目錄結(jié)構(gòu)如下:

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

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

借用官方的兩張圖:

整體的層次關(guān)系是這樣的,最里面是 models,定義我們的表結(jié)構(gòu),然后中間是業(yè)務邏輯層,業(yè)務邏輯層會提供接口,給最外層的 API 來調(diào)用,最外層就是一些工具和調(diào)用入口。

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

所以,它們之間的調(diào)用關(guān)系看起來是這樣的:

  
 
 
 
  1. HTTP > usecase 
  2.        usecase > repository (Postgres) 
  3.        usecase < repository (Postgres) 
  4. HTTP < usecase 

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

項目地址:

  • https://github.com/yongxinz/id-maker

本文轉(zhuǎn)載自微信公眾號「AlwaysBeta」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系A(chǔ)lwaysBeta公眾號。


文章標題:Go開發(fā)的一款分布式唯一ID生成系統(tǒng)
標題路徑:http://www.dlmjj.cn/article/djjiicd.html