摘要:幾乎所有的系統(tǒng)都存在生成唯一的需求,如用戶賬單等,由于系統(tǒng)通常是分布式架構(gòu),因而需要有合適的分布式生成方案。優(yōu)勢和數(shù)據(jù)庫自增方案類似缺點同樣仍然有性能上限,依賴數(shù)據(jù)庫的可用性。使用時,可以使用具體的場景選擇合適的方案。
幾乎所有的系統(tǒng)都存在生成唯一ID的需求,如用戶ID、賬單ID等,由于系統(tǒng)通常是分布式架構(gòu),因而需要有合適的分布式ID生成方案。
常見的分布式唯一ID方法有(歡迎補充):
時間戳
數(shù)據(jù)庫自增ID
UUID
放號系統(tǒng)
類snowflake
一、時間戳
原理: 使用直接使用時間戳毫秒值或微秒值作為ID
缺點: 每個時間單位只能生成一個ID, 在分布式架構(gòu)中不好保證唯一性。
適用場景: 一般很少適用這種方案
二、數(shù)據(jù)庫自增ID
原理: 基于MySQL等數(shù)據(jù)庫的auto_inscrement功能
優(yōu)勢: 實現(xiàn)簡單(數(shù)據(jù)庫自帶功能),生成的ID單調(diào)遞增,保證全局唯一;ID長度靈活
缺點: 存儲性能上限(MySQL性能), 對數(shù)據(jù)庫重度依賴,一旦數(shù)據(jù)庫宕機則無法生產(chǎn)繼續(xù)生成ID。
三、UUID
原理: 多個版本,大致原理是 時間戳+機器ID+CPU時鐘+隨機數(shù)。 通過CPU時鐘保證本地唯一,通過機器ID+CPU時鐘保證全局唯一
優(yōu)勢: 全局唯一,本地生成,沒有性能上限
缺點: 生成ID過長(32位16進制字符),不是單調(diào)遞增
四、放號系統(tǒng)
原理: 通常是基于數(shù)據(jù)庫自增ID的方案改造,只是每次批量獲取一個號段,提升了性能。
優(yōu)勢: 和”數(shù)據(jù)庫自增ID“方案類似
缺點: 同樣仍然有性能上限,依賴數(shù)據(jù)庫的可用性。數(shù)據(jù)庫主備切換時可能發(fā)生ID沖突。存儲耗時尖刺(更新DB時延時高)。因為號段通常是定長,拓展性差,對流量波動大的場景不太適用。
參考: https://tech.meituan.com/2019/03/07/open-source-project-leaf.html
升級
放號系統(tǒng)可以升級多個變種,比如采用多個數(shù)據(jù)庫(通過數(shù)據(jù)庫實例ID+數(shù)據(jù)庫自增ID), 在ID消耗完之前(比如消耗了50%)就預(yù)申請?zhí)柖蔚确桨浮?/p>
五、類snowflake算法方案
原理: 時間戳+機器ID+序列號
優(yōu)勢: uint64型,全局唯一,單調(diào)遞增,本地生成性能高,每秒能生成的ID較多。
缺點: 需要解決三大問題(增加了復(fù)雜度)
三大問題
時間回撥
時間回撥問題的幾種解決方案:
機器ID的分配和回收
機器ID的分配:
機器ID的上限
snowflake算法使用10bit存儲機器,所以機器ID的上線是2^10=1024; 不過這一般也能滿足業(yè)務(wù)需要了(只要做好分配和回收)
六、小結(jié)
實際業(yè)務(wù)中,<放號系統(tǒng)>和<類snowflake>兩種方案適用的場景較廣。 使用時,可以使用具體的場景選擇合適的方案。同時,可以結(jié)合需要進行優(yōu)化。
比如:用戶ID可以使用<放號系統(tǒng)>生成,訂單號等可以使用類snowflake方案來生成。
使用類snowflake方案時,使用哪種方式分配機器ID也可以根據(jù)具體的場景選擇。 比如機器較少,各個進程配置方便手動配置時,可以采用手動配置的方式; 如果實在集群中,Pods節(jié)點的最后8bit肯定不同,Pods自動擴縮容的場景,可以采用IP地址Hash值的方式來生成機器ID。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/125952.html
摘要:數(shù)據(jù)遷移,主要利用阿里云數(shù)據(jù)傳輸服務(wù)的數(shù)據(jù)遷移能力,涉及到全量遷移增量遷移一致性校驗及反向任務(wù)。小結(jié)通過周密的遷移方案設(shè)計,以及強大的數(shù)據(jù)遷移工具的能力,閑魚商品庫順利完成億在線數(shù)據(jù)庫服務(wù)遷移,獨立的物理部署顯著提升商品庫在線服務(wù)的穩(wěn)定性。 背景 在系統(tǒng)的快速迭代過程中,業(yè)務(wù)系統(tǒng)往往部署在同一個物理庫,沒有做核心數(shù)據(jù)和非核心數(shù)據(jù)的物理隔離。隨著數(shù)據(jù)量的擴大這種情況會帶來穩(wěn)定性的風(fēng)險,如...
摘要:但是,隨者工程開發(fā)的復(fù)雜程度和代碼規(guī)模不斷地增加,暴露出來的各種性能問題也愈發(fā)明顯,極大的影響著開發(fā)過程中的體驗。對應(yīng)的資源也可以直接由頁面外鏈載入,有效地減小了資源包的體積。 背景 如今前端工程化的概念早已經(jīng)深入人心,選擇一款合適的編譯和資源管理工具已經(jīng)成為了所有前端工程中的標配,而在諸多的構(gòu)建工具中,webpack以其豐富的功能和靈活的配置而深受業(yè)內(nèi)吹捧,逐步取代了grunt和gu...
摘要:表示生成一個懶加載的,只有當(dāng)需要時才會被加載。主要是作用域提升,將所有模塊放在同一個作用域當(dāng)中,一方面能提高運行速度,另一方面也能降低文件體積。前提是你的代碼是用模塊寫的。參考文章學(xué)習(xí)小結(jié) 前言 之前接手公司一個前端項目,開發(fā)了幾個月后越來越難以忍受項目結(jié)構(gòu)的混亂和打包體積的臃腫(腳手架和基本功能代碼都是從公司的其他項目復(fù)制過來的),如果不立即進行重構(gòu),難以想象以后要怎么維護各個產(chǎn)品線...
閱讀 3514·2023-04-25 20:09
閱讀 3720·2022-06-28 19:00
閱讀 3035·2022-06-28 19:00
閱讀 3058·2022-06-28 19:00
閱讀 3131·2022-06-28 19:00
閱讀 2859·2022-06-28 19:00
閱讀 3014·2022-06-28 19:00
閱讀 2610·2022-06-28 19:00