分佈式 原理的核心應該算是一致系統設計,而不是一種技術 mysql
分佈式惟一單號的設計都必須有必定的格式,純隨機沒法實現惟一單號, 格式能夠解決分佈式問題
GUID/UUID 工具生成, 用到了 redis
當前日期和時間,UUID的第一個部分與時間有關,若是你在生成一個UUID以後,過幾秒後又生成了一個UUID,則第一個部分不一樣,其他相同。
時鐘序列。
全局惟一的IEEE機器識別號,若是有網卡,從網卡MAC地址得到,沒有網卡以其餘方式得到。—(mac地址這部分能夠解決分佈式問題,不通機器由於這部分不一樣,因此不一樣機器生成單號確定不一樣 )算法
UUID的惟一缺陷在於生成的結果穿會比較長。關於UUID這個標準使用最廣泛的是微軟的GUID(Globals Ujique Identifiersspring
SnowFlake https://blog.csdn.net/li396864285/article/details/54668031sql
在分佈式系統中不一樣機器產生的id必須不一樣.Snowflake算法核心把時間戳,工做機器id,序列號(毫秒級時間41位+機器ID 10位+毫秒內序列12位)組合在一塊兒。
會員團隊 > 單號生成組件 > image2021-1-28_11-56-57.png安全
機器id 解決了分佈式問題springboot
mysql , redis 自增markdown
最終由一臺機器,一個線程實現的,固定的就是一個特殊隱藏格式"空"
總結來講」分佈式「 嚴格 惟一單號生的條件有3點
1 有固定格式 機器標識 (記做「機器標識」) + 經過線程安全方式生成的惟一標識(這裏記做「隨機數」) + 不一樣標識段有有分割符(包含隱形分割符如:機器標識長度固定,那麼機器分割符以後爲空的方式也算固定分割符, 機器1&abc, 和機器1abc, 這2種效果同樣)網絡
2有惟一機器標識,(myqsql, redis 這種也能夠說是有標識,空標識,由於最終就一臺機器)jvm
3 單機生成標識中 隨機數生成必須線程安全
方式1 (嚴格惟一) 單號最終組生成的機器:業務機器
格式: yyyyMMssSSS+ redis 自增(key 爲MinuteOfHour, 過時時間 1分鐘)
機器標識:隱形空(統一redis 機器)
隨機數標識:redis 自增num(key 爲MinuteOfHour, 過時時間 1分鐘)
弊端: redis 可用性依賴性高:業務服務須要接入redis
方式2:(嚴格惟一) 單號最終組生成的機器:業務機器
格式:jvm 機器編號 +( yyyyMMssSSS+ 線程安全生成一秒鐘的惟編號)
機器標識:jvm 機器編號
隨機數標識:( yyyyMMssSSS+ 線程安全生成一秒鐘的惟編號)
弊端: 每臺機器都要手動配置機器編號
方式3:(嚴格惟一)單號最終組生成的機器: 統一單號生成服務
格式:: yyyyMMssSSS+ redis 自增(key 爲調用方編號+MinuteOfHour, 過時時間 1分鐘)
機器標識: 機器編號隱形空(統一redis 機器)
隨機數標識: redis 自增(key 爲調用方編號+MinuteOfHour, 過時時間 1分鐘)
弊端: 單號服務要保證搞可用
方式4:(嚴格惟一)單號最終組生成的機器: 統一單號生成服務, 或者業務自己均可以
格式 : 任意編號標識 + 經過記錄惟一id置換編號 (也能夠抽象的說全部的數據都不重複的格式)
機器標識:機器編號隱形空 (能夠認爲是存儲單號庫的倉庫 mysql等)
隨機數標識: 存儲單號庫 提早已經去重
解釋一下:單號倉庫要提早生成一批去重以後的惟一編號,業務需經過惟一id (分表的能夠再作擴展), 換取倉庫種的惟一編號
弊端:要維護一套單號倉庫
方式5:(不嚴格惟一) 單號最終組生成的機器:業務機器----
格式:: yyyyMMssSSS+ uid + 一位英文字符+ 2位 隨機字符(從26個英文字母+10個阿拉伯數字中隨機)
機器標識:無
隨機數標識: yyyyMMssSSS+ uid + 一位英文字符+ 2位 隨機字符
弊端: 同一個用戶的單號有重複的可能)
最終選擇方案2:
理由:
1 目前的需求須要嚴格的單號惟一 (排除方案5)
2 單號生成依賴外部服務,服務的穩定性沒法保證(排除3, 4)
3 創建單號庫 接入代價過大 (排除方案 4)
4 目前公司的redis 服務自己穩定性沒有保障,每次請求redis 獲取單號也有網絡開銷 (排除方案2)
方案2 具體到業務細節
惟一單號3個條件以下: 單號最終組生成的機器:業務機器
格式:yyyyMMddHHmmss(14) + 機器編號(8位)+ 隨機編碼(4位)
機器標識:系統啓動的時候 經過http 訪問統一的機器編碼服務
隨機數標識:機器本地使用線程安全方式獲取4位惟一編碼 (1秒內)
功能更實現作的工做
提供一個機器編碼管理工具,爲機器生成惟一機器編碼服務,
提供一個springboot-start,接入方引入pom文件就完成了接入
以上規則 爲我的總結若有不一樣看法能夠留言討論,實施過程若有疑問 ,也能夠留言,看到會回覆解答