電商系統中的ID是如何生成的

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"分佈式ID","attrs":{}},{"type":"text","text":", 我們可能都聽過分佈式系統,分佈式,分佈式ID可能比較少,因爲業務,方向以及系統維護的方面出發,現在的互聯網中的項目,多數都需要一個全局且唯一,有增量趨勢的","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"標識","attrs":{}},{"type":"text","text":"。目前用的可能是MySQL的自增主鍵,UUID,時間戳等,但是對於日益增長的消息系統,點評,支付等具體操作,都需要一個穩定,全局唯一,且有明顯自增趨勢的ID作爲唯一標識。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"一個分佈式全局ID的硬性要求","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/4b/4b118ef59c5452302bd7c878898ceee5.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"其中信息安全,可能有的小夥伴不太瞭解,你每次請求獲取的ID(查詢操作),這個如果是遞增,我們就能直觀的判斷出有信息,多少人,這是第多少個等,這屬於敏感信息泄露的範疇, 安全還是很重要的;","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"規則我們確定之後,我們就要求生成這個ID系統的要求,之前是對於生成","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"單個一個ID的要求,","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"對ID系統生成的可用性要求","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"因爲是存在於分佈式系統的,那也就是我們比較熟悉的,","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/2e/2e7e40799820797ef1e69611ccd6e3b0.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"高可用","attrs":{}},{"type":"text","text":":發起一個獲取分佈式ID的請求時,必須保證服務器在99.999%的時候給我創建成功","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"低延遲","attrs":{}},{"type":"text","text":": 獲取分佈式ID,服務器響應快速,不能有高延遲,會有誤差","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"高併發","attrs":{}},{"type":"text","text":": 一秒鐘可以獲取10萬左右的ID,而且要成功,服務器要扛得住","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"情景再現:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"面試中,對於面試者做過的項目,面試官一般會採用聊集羣,QPS等情況驗證,項目的真實性, 其中分佈式ID就屬於具體實現了,一般會問:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"你們項目是,分佈式微服務,集羣化部署,電商的這個系統中對於訂單,支付等","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"全局ID是如何生成的?","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"雪花算法 snowFlake;","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"現在系統常用的ID生成方式:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"數據庫自增,UUID ,時間戳;Redis集羣","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"(1) 數據庫自增(mysql自增)","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"其中數據庫自增,對於單體系統,後臺系統用的比較多,因爲併發小,使用人數也少,適合於小系統,QPS一般幾十到一百左右的,","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"缺點:對於數據敏感的場景不宜使用, 且支撐不了分佈式場景,自增之後還是會還原爲原來的數值","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"(2) UUID","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"UUID用的是比較普遍的一個ID, 因爲全局唯一,但是它存在很多的問題","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"UUID的缺點:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"無序","attrs":{}},{"type":"text","text":",且無法預測生成順序,無法有效的呈現遞增趨勢","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"存儲","attrs":{}},{"type":"text","text":",字段很長,耗費數據庫資源,對於特點環境存在一些問題,","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"優點:只剩下全局唯一了","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"(3)時間戳","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"一般可以使用時間戳加具體的業務ID 來規定,但是用的也比較少","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"(4)基於Redis集羣生成策略","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"因爲Redis特性是基於單線程,所以用它生成ID操作是原子性的,集羣化可以實現,","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"通過設備集羣的增長步長,起始值,就可以","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"比如Redis集羣有五臺機器, 可以初始化爲每臺Redis的值 1,2,3,4,5;步長是5;","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"各個Redis生成的Id爲:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"A:1,6,11,16,21,...B:2,7,12,17.22,...C:3,8,13,18,23,...D:4,9,14,19,24,...E:5,10,15,20,25,...","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"雖然可以實現,但是配置Redis集羣后, 要實現數據丟失怎麼辦,key的失效時間等等,","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"不是不能做,是殺雞焉用牛刀","attrs":{}},{"type":"text","text":",對的;","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"然後就到了我們今天的主題:","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"(5)Twitter開源的snowflake;","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Snowflake(雪花) 是一項服務,用於爲 Twitter 內的對象(推文,直接消息,用戶,集合,列表等)生成唯一的 ID。這些 IDs 是唯一的 64 位無符號整數,它們","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"基於時間","attrs":{}},{"type":"text","text":",而不是順序的。完整的 ID 由時間戳,工作機器編號和序列號組成。當在 API 中使用 JSON 數據格式時,請務必始終使用 id_str 字段而不是 id,這一點很重要。這是由於處理JSON 的 Javascript 和其他語言計算大整數的方式造成的。如果你遇到 id 和 id_str 似乎不匹配的情況,這是因爲你的環境已經解析了 id 整數,並在處理的過程中仔細分析了這個數字。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Twitter的分佈式雪花算法SnowFlake,經測試snowflake每秒能夠產生","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"26萬","attrs":{}},{"type":"text","text":"個自增可排序的ID1、twitter的SnowFlake生成ID能夠按照時間有序生成2、SnowFlake算法生成id的結果是一個64bit大小的整數,爲一個Long型(轉換成字符串後長度最多19).3、分佈式系統內不會產生ID碰撞(由datacenter和workerld作區分)並且效率較高。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"分佈式系統中,有一些需要使用全局唯一ID的場景,生成ID的基本要求","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"1.在分佈式的環境下必須全局且唯一。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"對比","attrs":{}},{"type":"text","text":"2.一般都需要單調遞增,因爲一般唯一ID都會存到數據庫,而Intodb的特性就是將內容存儲在主鍵索引樹上的葉子節點,而且是從左往右,遞增的,所以考慮到數據庫性能,一般生成的id也最好是單調遞增。爲了防止ID衝突可以使用36位的UUID,但是UUID有一些缺點,首先他相對比較長,另外UUID-般是無序的","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/3e/3ea20135e6f12be4ec73326ff50ae2c6.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/71/717d1187ae1d9f10c0bfea63a8719f6d.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"snowflake是中可以用69年是否成立?","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"雪花算法可以高度唯一和可用性時間長:作比較, 41位的1二進制數字,對於十進制來說,是多少呢;十進制的數字是:","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"2199023255551","attrs":{}},{"type":"text","text":"https://tool.lu/hexconvert/ 進制轉換的工具箱","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我做了個demo來證明:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/9a/9abafc897eb6a12c250166899897e402.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"其中主要設置的是 10位的工作進程位;-","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"一般分爲數據中心和機器位","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"生成snowFlake的ID","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們以springboot的項目來構建這個snowFlake的ID生成,","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"依賴:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":" \n \n cn.hutool\n hutool-captcha\n 5.6.0\n \n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這裏我們表示的是Java代碼庫中,hutool的類庫,調用已經封裝好的IdUtil就好","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"text"},"content":[{"type":"text","text":"package com.generate;\n\nimport cn.hutool.core.lang.Snowflake;\nimport cn.hutool.core.net.NetUtil;\nimport cn.hutool.core.util.IdUtil;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.stereotype.Component;\n\nimport javax.annotation.PostConstruct;\n\n\n/**\n * 生成全局ID\n * 雪花算法Tiwwer\n */\n\n@Component\n@Slf4j\npublic class SnowFlakeUtil {\n\n //主要配置工作位十位,其中5位是機器位(節點或者是具體哪臺機器),5位數數據中心\n\n private Long workerID = 0L;\n\n private Long datecenter = 1L;\n\n private Snowflake snowflake = IdUtil.createSnowflake(workerID, datecenter);\n\n @PostConstruct\n private void init() {\n\n try {\n //當前機器的IP\n workerID = NetUtil.ipv4ToLong(NetUtil.getLocalhostStr());\n log.info(\"當前機器的workerID{}\", workerID);\n } catch (Exception e) {\n log.warn(\"獲取機器ID失敗\", e);\n workerID = Long.valueOf(NetUtil.getLocalhost().hashCode());\n log.info(\"當前機器workID\", workerID);\n }\n\n\n }\n\n //簡單版本\n public synchronized Long createSnowFlakeID() {\n //生成的ID加鎖synchronized\n return snowflake.nextId();\n\n }\n\n //全局版本的\n public synchronized long showFlakeID(long workId, long datacenterID) {\n Snowflake snowflake = IdUtil.createSnowflake(workerID, datecenter);\n return snowflake.nextId();\n }\n\n\n public static void main(String[] args) {\n System.out.println(new SnowFlakeUtil().createSnowFlakeID());\n// 1401136955063926784\n }\n\n\n}\n","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這裏是簡單的一個版本,與真實項目中有差異,差異主要是體現在參數配置中,","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"雖然雪花算法可以生成,唯一且自增的ID ,但是它也存在問題,是關於時間戳的;","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"總結:","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"優點:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"​ 1.不依賴與第三方系統(MySQL,Redis等),穩定性,生成ID的性能非常高","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"​ 2.毫秒數在高位,自增序列在低位,整個ID 都是有趨勢遞增的;","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"缺點:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"依賴於機器時鐘,也就是對錶時間,如果機器回撥,會導致重複ID生成;","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這種情況一般會發生在分佈式環境中,每臺機器上的時鐘不可能完全同步,有時候會出現不是全局遞增的情況","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"但是對於中小公司,此缺點可以忽略, 一般會要求趨勢遞增,並不會嚴格要求遞增;","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"snowFlake的優化","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"對於時鐘回撥的情況,國內的大廠也修復了這個雪花算法的問題,比如","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"百度開源的Uid Generator","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"Leaf--美團點評分佈式生成ID","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"兩者都是在雪花算法的基礎上,優化和改進;","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"適用於","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"對於普通公司,200人上下的,體制主要對於研發人員,都可以使用snowFlake, 配置具體ID生成,規定其中位數的默認值,","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"尤其是對於時鐘回撥的,(時間一直在走),重點在配置,選擇,處理異常,就可以完成","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"寄語","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"今日的分享就到這裏了,學海無涯難行洲,唯有堅持方可成;我是盧卡,我們下期見","attrs":{}}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章