【分布式】聊聊分布式id實現方案和生產經驗

在這里插入圖片描述
對于分布式Id來說,在面試過程中也是高頻面試題,所以主要針對分布式id實現方案進行詳細分析下。

應用場景

對于無論是單機還是分布式系統來說,對于很多場景需要全局唯一ID,

  • 數據庫id唯一性
  • 日志traceId 可以方便找到日志鏈,一般使用uuid 更多一點
  • 冪等場景下,mq、api接口層面 保證冪等下
  • 業務系統訂單id

UUID

最簡單的就是使用UUID,UUID的規則是一組32位16進制數字構成,形式就是8-4-4-4-8,主要就是利用當前時間和時鐘序列 和 全局唯一的IEEE機器識別。

UUID uuid = UUID.randomUUID();307e16d0-26d4-4fff-ab06-a9397b8369fb

優點:實現簡單,全局唯一,缺點是不具有連續性,并且占用空間比較大,對于mysql主鍵來說不具備友好。

數據庫自增ID

就目前公司內部,其實還是使用的數據庫自增id進行處理,對于數據庫來說的話,就是多個實例操作表自增id,對于業務來說使用自定義時間戳來實現。

還有一種方式就是創建一個單獨的表,通過數據庫本身的自增id來保證。

CREATE TABLE `test_order_id`  (`id` bigint NOT NULL AUTO_INCREMENT,`title` char(1) NOT NULL,PRIMARY KEY (`id`),UNIQUE KEY `title` (`title`)
) ENGINE = InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET =utf8;BEGIN;REPLACE INTO test_order_id (title) values ('p') ;
SELECT LAST_INSERT_ID();COMMIT;

這種方式的優點就是 實現比較簡單,但是缺點就是不具備高可用性,如果mysql是單節點部署的話,那么整體就不可用。

高可用數據庫實例

部署多個數據庫實例,通過設置不同的自增,比如mysql實例1,自增是2,從1開始,mysql實例2 從2開始,那么就是 實例1 : 1、3、5、7,實例2: 2、4、6、8。

對于并發量不高的場景來說,可以解決,但是對于高并發場景來說,數據庫實例就是成為瓶頸。如果1秒1000個訂單,那么就需要頻繁訪問1000次數據庫,顯然這個網絡以及IO就成為短板。

號段模型

號段模式,其實就是通過在一個表中唯一一條記錄,然后通過業務區分,每次獲取一個區間的號,這樣比如獲取1-1000的號段,那么就只需要交互一次數據庫,并且通過添加version來避免出現并發修改數據的問題。
在這里插入圖片描述

Redis

除了借助于mysql,還可以通過redis的自增 incr命令來實現自增ID,并且可以部署一主多從的架構,來保證高可用性。

    public long nextId(String item){// 1.生成時間戳LocalDateTime now = LocalDateTime.now();// 格林威治時間差long nowSecond = now.toEpochSecond(ZoneOffset.UTC);// 我們需要獲取的 時間戳 信息long timestamp = nowSecond - BEGIN_TIMESTAMP;// 2.生成序號 --》 從Redis中獲取// 當前當前的日期String date = now.format(DateTimeFormatter.ofPattern("yyyy:MM:dd"));// 獲取對應的自增的序號Long increment = redisTemplate.opsForValue().increment("id:" + item + ":" + date);return timestamp << 32 | increment;}

具體原理其實就是 當前時間戳-制定時間 << 32 | 自增的id 這樣輸出的就是連續的id了

雪花算法

雪花算法整體結構就是 64位 0-41位位毫秒值,5位是數據中心id,5位機器id,最后12位是毫秒級別內的自增id
在這里插入圖片描述

分析源碼 可以大概了解其核心流程
在這里插入圖片描述

雪花算法時鐘回撥

在實際的生產環境中,分布式環境下,其實時鐘是很難保證統一的,所以就可能實現時間不一樣的情況,導致時鐘回撥問題,我們來分析兩類問題

情況1:UTC時間是8點01,實例機器是8點整
情況2:UTC時間是8點01 實例機器是8點03

對于情況1來說,其實就調整一下時間就好,1分鐘內的id生成不用就可以。但是對于第二種情況,相當于需要從3分回退到01分,那么其中的2分鐘的時間已經生成了對應的id,如果在次生成,就會出現id重復的問題?

如何解決呢
其實比較簡單,大方向就是如果時間短,那么就等得阻塞對應的時間就可以,如果超過1S以上,服務直接下線,通過其他實例獲取id就可以。
在這里插入圖片描述

其他

業界有主流的其他方案,具體可以詳細看
百度、美團對應的解決方案,這里自己查看對應文檔就可以。

總結

從上面的分析可以知道 目前業界主流的方案,我們來抽絲剝繭下,對于設計一個分布式id來說,需要哪些核心點
1.需要順序 這樣可以簡單清晰
2.依賴的服務需要高可用、高性能
3.全局唯一
4.有具體的業務含義,比如針對訂單號:11xxx 開始,還款訂單21xxx,借款訂單31xxx。就比較清晰。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/73191.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/73191.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/73191.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【性能測試】Jmeter如何做一份測試報告(3)

本篇文章主要介紹Jmeter中下載插件&#xff08;Jmeter Plugins&#xff09; 如何使用監聽器插件&#xff0c;線程組插件&#xff0c;梯度壓測線程組 測試報告需要去關注的數據&#xff0c;怎么看測試報告圖表 目錄 一&#xff1a;插件下載 1&#xff1a;下載地址 2&#xff…

cocos creator使用mesh修改圖片為圓形,減少使用mask,j減少drawcall,優化性能

cocos creator版本2.4.11 一個mask占用drawcall 3個以上&#xff0c;針對游戲中技能圖標&#xff0c;cd,以及多玩家頭像&#xff0c;是有很大優化空間 1.上代碼&#xff0c;只適合單獨圖片的&#xff0c;不適合在圖集中的圖片 const { ccclass, property } cc._decorator;c…

AI重構SEO關鍵詞布局

內容概要 在搜索引擎優化&#xff08;SEO&#xff09;領域&#xff0c;AI技術的深度應用正在顛覆傳統關鍵詞布局邏輯。通過機器學習算法與語義分析模型&#xff0c;智能系統能夠實時解析海量搜索數據&#xff0c;構建動態詞庫并精準捕捉用戶意圖。相較于依賴人工經驗的關鍵詞篩…

泛微ecode的頁面開發發送請求參數攜帶集合

1.在開發過程中我們難免遇見會存在需要將集合傳遞到后端的情況&#xff0c;那么這里就有一些如下的注意事項&#xff0c;如以下代碼&#xff1a; // 新增action.boundasync addQuestion(formData) {var theList this.questionAnswerList;var questionAnswerListArray new Ar…

20250212:linux系統DNS解析卡頓5秒的bug

問題: 1:人臉離線識別記錄可以正常上傳云端 2:人臉在線識別請求卻一直超時 3:客戶使用在線網絡 思路:

道路運輸安全員考試:備考中的心理調適與策略

備考道路運輸安全員考試&#xff0c;心理調適同樣重要。考試壓力往往會影響考生的學習效率和考試發揮。? 首先&#xff0c;要正確認識考試壓力。適度的壓力可以激發學習動力&#xff0c;但過度的壓力則會適得其反。當感到壓力過大時&#xff0c;要學會自我調節。可以通過運動…

LLM - 白話RAG(Retrieval-Augmented Generation)

文章目錄 Pre一、大模型的"幻覺"之謎1.1 何為"幻覺"現象&#xff1f;1.2 專業場景的致命挑戰 二、RAG技術解析&#xff1a;給大模型裝上"知識外掛"2.1 核心原理&#xff1a;動態知識增強2.2 技術實現三部曲 三、RAG vs 微調&#xff1a;技術選型…

探索現代 C++:新特性、工程實踐與熱點趨勢

目錄 一、現代 C 的關鍵特性與熱點關聯 二、精簡代碼示例解析 三、工程實踐中的應用思考 四、總結與展望 近幾年&#xff0c;人工智能、邊緣計算與跨語言開發成為技術熱點&#xff0c;而 C 作為高性能系統編程的主力軍&#xff0c;也在不斷進化。從 C11 到 C20&#xff0c;…

《HTML + CSS + JS 打造炫酷輪播圖詳解》

《HTML CSS JS 打造炫酷輪播圖詳解》 一、項目概述 本次項目旨在使用 HTML、CSS 和 JavaScript 實現一個具有基本功能的輪播圖&#xff0c;包括圖片自動輪播、上一張 / 下一張按鈕切換、小圓點指示與切換等功能&#xff0c;以提升網頁的交互性和視覺吸引力。 二、實現步驟…

257. 二叉樹的所有路徑(遞歸+回溯)

257. 二叉樹的所有路徑 力扣題目鏈接(opens new window) 給定一個二叉樹&#xff0c;返回所有從根節點到葉子節點的路徑。 說明: 葉子節點是指沒有子節點的節點。 示例: 思路&#xff1a;在葉子節點收割結果&#xff0c;如果不是葉子節點&#xff0c;則依次處理左右子樹&a…

【架構差異】SpringとSpringBoot:Bean機制的深入剖析與自動配置原理

目錄標題 SpringBoot框架中Bean機制的深入剖析與自動配置原理摘要1. 引言2. SpringBoot與Spring的架構差異2.1 從Spring到SpringBoot的演進2.2 SpringBoot中的Bean容器體系 3. SpringBoot的自動配置機制3.1 SpringBootApplication解析3.2 自動配置原理深度解析3.2.1 自動配置類…

CSDN博客:Markdown編輯語法教程總結教程(中)

?個人主頁&#xff1a;折枝寄北的博客 Markdown編輯語法教程總結 前言1. 列表1.1 無序列表1.2 有序列表1.3 待辦事項列表1.4 自定義列表 2. 圖片2.1 直接插入圖片2.2 插入帶尺寸的圖片2.3 插入寬度確定&#xff0c;高度等比例的圖片2.4 插入高度確定寬度等比例的圖片2.5 插入居…

ChebyKAN0、ChebyKAN1 網絡閱讀

目錄 ChebyKAN0 Chebyshev Polynomial-Based Kolmogorov-Arnold Networks: An Efficient Architecture for Nonlinear Function Approximation 參考文獻 文章內容 文章詳細結構 5. Experiments and Results 5.1 Digit Classification on MNIST 5.2 Function Approximat…

RK3588部署YOLOv8(2):OpenCV和RGA實現模型前處理對比

目錄 前言 1. 結果對比 1.1 時間對比 1.2 CPU和NPU占用對比 2. RGA實現YOLO前處理 2.1 實現思路 2.2 處理類的聲明 2.3 處理類的實現 總結 前言 RK平臺上有RGA (Raster Graphic Acceleration Unit) 加速&#xff0c;使用RGA可以減少資源占用、加速圖片處理速度。因此…

破局者登場:中國首款AI原生IDE Trae深度解析--開啟人機協同編程新紀元

摘要 字節跳動于2025年3月3日正式發布中國首款AI原生集成開發環境Trae國內版&#xff0c;以動態協作、全場景AI賦能及本土化適配為核心優勢。Trae內置Doubao-1.5-pro與DeepSeek R1/V3雙引擎&#xff0c;支持基于自然語言生成端到端代碼框架、實時上下文感知與智能Bug修復&…

【PyCharm】Python和PyCharm的相互關系和使用聯動介紹

李升偉 整理 Python 是一種廣泛使用的編程語言&#xff0c;而 PyCharm 是 JetBrains 開發的專門用于 Python 開發的集成開發環境&#xff08;IDE&#xff09;。以下是它們的相互關系和使用聯動的介紹&#xff1a; 1. Python 和 PyCharm 的關系 Python&#xff1a;一種解釋型、…

SNIPAR:快速實現親緣個體的基因型分離與推斷

SNIPAR&#xff1a;快速實現親緣個體的基因型分離與推斷 近日&#xff0c;英國劍橋大學研究團隊在Nature Genetics上發表了最新研究成果——SNIPAR&#xff08;SNP-based Inference of Pedigree relationship, Ancestry, and Recombination&#xff09;。這一強大的工具可以幫助…

3.11記錄

leetcode刷題&#xff1a; 1. 334. 遞增的三元子序列 - 力扣&#xff08;LeetCode&#xff09; 方法一&#xff1a;使用貪心算法求解 class Solution(object):def increasingTriplet(self, nums):first nums[0]second float(inf)for i in nums:if i>second:return Truee…

阿里云操作系統控制臺評測:國產AI+運維 一站式運維管理平臺

阿里云操作系統控制臺評測&#xff1a;國產AI運維 一站式運維管理平臺 引言 隨著云計算技術的飛速發展&#xff0c;企業在云端的運維管理面臨更高的要求。阿里云操作系統控制臺作為一款集運維管理、智能助手和系統診斷等多功能于一體的工具&#xff0c;正逐步成為企業高效管理…

大語言模型學習--向量數據庫Milvus實踐

Milvus是目前比較流行的開源向量數據庫&#xff0c;其官網地址 Milvus 是什么&#xff1f; | Milvus 文檔 1.Milvus簡介 Milvus 是一種高性能、高擴展性的向量數據庫。Milvus 提供強大的數據建模功能&#xff0c;能夠將非結構化或多模式數據組織成結構化的 Collections。它支…