Skip to content

babyblue94520/buffer-id

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

分布式唯一ID

Demo

http://127.0.0.1:8080/swagger-ui.html

  • 先執行 src/main/resources/sql/init.sql 初始化資料庫
  • 修改 src/main/resources/application.yml 連線資料

需求背景

  • 唯一性:
  • 高效能:避免 ID 的生成效能成為系統的瓶頸
  • 任性的ID前綴:需求方喜歡特定前綴作為 ID 開頭 ex: XXX000001

設計

  • 依賴 MySQL 維護當前序號最大值 (5.7.29)
  • 利用 Row Lock 處理序號遞增
  • 使用 User Defined Variables 取回當前交易最大值,降低 Row Lock 的時間
  • 支持數字 ID 和前綴字串 ID

連續ID

每秒可產生約1萬 ID ,效能依賴資料庫

優點

  • 連續,不浪費ID

缺點

  • 每次訪問資料庫,效能差

小技巧

  • 可利用不同的前綴,避免競爭相同的鎖

Single Buffer ID

所有執行緒共用一個 ID buffer,效能依賴機器硬體

純數字

每秒可產生約 1千萬左右 ID

前綴

每秒可產生約 5百萬左右 ID

優點

  • 短時間內,只會訪問資料庫一次,大幅下降資料庫交易壓力
  • 相較於 Multi Buffer 較不浪費 ID

缺點

  • ID 連續性不高
  • 系統重啟浪費 ID 數量
  • 執行緒需要競爭鎖

Multi Buffer ID

執行緒各自有 ID buffer,效能依賴機器硬體

純數字

每秒可產生約 1億~2億5 ID

前綴

優點

  • 短時間內,只會訪問資料庫一次,大幅下降資料庫交易壓力
  • 利用 Java ThreadLocal 無鎖的方式產生 ID,效能極高

缺點

  • ID 連續性較不高
  • 系統重啟非常浪費 ID 數量

小技巧

  • 自動計算 10 秒內需要多少 buffer 降低資料庫的壓力