分布式 ID 生成的五種方法:優缺點與適用場景

0.簡介

在分布式系統中,生成全局唯一的id是一個常見的需求。由于分布式系統的特性(多節點,網絡分區,時鐘不同步等),傳統的單機ID生成方式不再適用,所以一些分布式生成方式應運而生,本文將對常見的幾種分布式ID生成方法的原理和應用進行介紹。

1.分布式ID的生成要求

分布式ID的生成一般要滿足以下要求:
1)全局唯一:生成的 ID 必須在整個系統中唯一。
2)高性能:ID 生成的速度要快,不能成為系統的瓶頸。
3)高可用:ID 生成服務必須高可用,不能因為單點故障導致系統不可用。
4)趨勢遞增:生成的 ID 最好具有遞增趨勢,便于數據庫索引和排序。

2.數據庫自增方式

數據庫的自增方式生成分布式ID就是使用數據庫的自增列來實現,其優缺點如下:
優點:
1)使用簡單,直接使用數據庫已有的自增功能;

2)能夠保證唯一性和遞增性;

缺點:

1)性能瓶頸,在高并發場景下,數據庫可能成為性能瓶頸;

2)可用性問題,存在單點故障可能;

使用場景:主要適用小規模分布式系統,對性能要求不高的場景。

在這里插入圖片描述

改進方式:
1)冗余主節點,避免單點寫入。
在這里插入圖片描述

2)批量生成id,降低讀寫頻率。其不需要挨個獲取,一次獲取多個同時更新max-id,下次就繼續在max-id增加。
在這里插入圖片描述

3.UUID

UUID(Universally Unique Identifier)是一個 128 位的全局唯一標識符,通常表示為 32 個十六進制字符,例如:

550e8400-e29b-41d4-a716-446655440000

優點:
1)簡單易用:無需中心化服務,每個節點都可以獨立生成 UUID。
2)全局唯一:UUID 的生成基于時間戳、隨機數和 MAC 地址,幾乎不可能重復。
3)性能個擴展性好:本地生成,沒有擴展和性能瓶頸。
缺點:
1)長度較長:128 位的 UUID 存儲和傳輸以及查詢開銷較大,可以拆成兩個uint64整數存儲。
2)無序性:UUID 是隨機生成的,不具備遞增趨勢,不利于數據庫索引。
適用場景:對ID長度以及有序性要求不高的場景。
改進方式:
1)可以增加時間信息,如在開頭增加毫秒數,優點就是能保證遞增;缺點就是可能在同一時間的話可能會出現沖突。

4.Snowflake算法

4.1 原理

Snowflake 是 Twitter 開源的分布式 ID 生成算法,生成的 ID 是一個 64 位的整數,結構如下:

1 bit41 bits10 bits12 bits
signtimestampmachine IDsequence

sign:符號位,固定為 0。

timestamp:41 位的時間戳,表示從某個起始時間到當前時間的毫秒數。

machine ID:10 位的機器 ID,用于區分不同的節點。

sequence:12 位的序列號,用于同一毫秒內生成多個 ID。
優點:

1)高性能:本地生成 ID,無需網絡通信。

2)趨勢遞增:ID 按時間戳遞增,便于數據庫索引。

3)高可用:無中心化服務,每個節點獨立生成 ID。
缺點:

1)時鐘回撥問題:如果系統時鐘回撥,可能導致 ID 重復。

2)機器 ID 分配:需要手動或通過外部服務分配機器 ID。
適用場景:大規模分布式系統,對性能和有序性要求較高的場景。

改進方式:可以通過等待時間同步解決時鐘回撥,通過擴展時間位來解決時間一出,通過動態機器id分配解決手動分配問題。

5.Redis自增ID

該方法是利用 Redis 的原子操作 INCR 或 INCRBY 生成全局唯一的 ID。

使用 Redis 的 INCR 命令生成自增 ID:

INCR id_generator

如果需要生成更長的 ID,可以使用

INCRBY id_generator 1000

優點:
1)高性能:Redis 的 INCR 操作是原子性的,性能較高。
2)簡單易用:實現簡單,無需復雜的算法。

缺點:
1)依賴 Redis:需要維護 Redis 服務,存在單點故障風險。

2)ID 長度有限:Redis 的 INCR 生成的 ID 是 64 位整數,可能不夠用。

適用場景:中小規模分布式系統,對性能和有序性有一定要求的場景。
改進方式:可以參考數據庫自增id方式優化。

6.Leaf算法

Leaf 是美團開源的分布式 ID 生成服務,結合了數據庫和 Snowflake 算法的優點。它支持兩種模式:

1)號段模式:從數據庫批量獲取 ID 段,緩存在本地。

2)Snowflake 模式:基于 Snowflake 算法生成 ID。

優點:
1)高性能:號段模式減少了數據庫訪問次數,Snowflake 模式本地生成 ID。

2)高可用:支持多節點部署,無單點故障。

3)靈活配置:支持號段模式和 Snowflake 模式切換。

缺點:
1)復雜度較高:需要部署和維護 Leaf 服務。

適用場景:大規模分布式系統,對性能和可用性要求較高的場景。
分布式id生成的五種方法

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

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

相關文章

基于單片機路燈自動控制儀仿真設計

標題:基于單片機路燈自動控制儀仿真設計 內容:1.摘要 本設計旨在解決傳統路燈控制方式效率低、能耗大的問題,開展了基于單片機的路燈自動控制儀仿真設計。采用單片機作為核心控制單元,結合光照傳感器、時鐘模塊等硬件,運用相關軟件進行編程和…

計算機網絡-MPLS VPN基礎概念

前面幾篇文章我們學習了MPLS的標簽轉發原理,有靜態標簽分發和LDP動態標簽協議,可以實現LSR設備基于標簽實現數據高效轉發。現在開始學習MPLS在企業實際應用的場景-MPLS VPN。 一、MPLS VPN概念 MPLS(多協議標簽交換)位于TCP/IP協…

LWIP的Socket接口

Socket接口簡介 類似于文件操作的一種網絡連接接口,通常將其稱之為“套接字”。lwIP的Socket接口兼容BSD Socket接口,但只實現完整Socket的部分功能 netconn是對RAW的封裝 Socket是對netconn的封裝 SOCKET結構體 struct sockaddr { u8_t sa_len; /* 長…

windows 安裝gdal實現png轉tif,以及柵格拼接

windows 安裝gdal實現png轉tif,以及柵格拼接 一、安裝gdal 網上有很多安裝gdal的方法,此處通過osgeo4w安裝gdal 1.下載osgeo4w 下載地址 https://trac.osgeo.org/osgeo4w/ 2、安裝osgeo4w exe文件安裝,前面部分很簡單,就不再…

Node.js 源碼概覽

Node.js 是一個基于 Chrome V8 引擎的 JavaScript 運行時環境,它的源碼結構相當龐大且復雜。下面我將為你講解 Node.js 源碼的主要結構和關鍵組成部分。 源碼結構 Node.js 的主要源碼目錄結構如下: node/ ├── lib/ # JavaScript 核心模…

Linux :線程 【生產者消費者模型】

Linux :線程 【生產者消費者模型與信號量】 (一)生產消費模型1、生產消費模式概念2、生產者消費者之間的關系3、生產者消費者模型優點 (二)基于BlockingQueue的生產者消費者模型1、基于阻塞隊列模型2、模擬實現基于阻塞…

mac本地docker鏡像上傳指定虛擬機

在Mac本地將Docker鏡像上傳至指定虛擬機的完整步驟 1. 在Mac本地保存Docker鏡像為文件 通過docker save命令將鏡像打包為.tar文件,便于傳輸至虛擬機。 # 示例:保存名為"my_image"的鏡像到當前目錄 docker save -o my_image.tar my_image:ta…

C++跨平臺開發經驗與解決方案

在當今軟件開發領域,跨平臺開發已成為一個重要的需求。C作為一種強大的系統級編程語言,在跨平臺開發中扮演著重要角色。本文將分享在實際項目中的跨平臺開發經驗和解決方案。 1. 構建系統選擇 CMake的優勢 跨平臺兼容性好 支持多種編譯器和IDE 強大…

Void: Cursor 的開源平替

GitHub:https://github.com/voideditor/void 更多AI開源軟件:發現分享好用的AI工具、AI開源軟件、AI模型、AI變現 - 小眾AI Void,這款編輯器號稱是開源的 Cursor 和 GitHub Copilot 替代品,而且完全免費! 在你的代碼庫…

基于HTML+JavaScript+CSS實現教學網站

摘要 21世紀是信息化的時代,信息化物品不斷地涌入我們的生活。同時,教育行業也產生了重大變革。傳統的身心教授的模式,正在被替代。互聯網模式的教育開辟了一片新的熱土。 這算是對教育行業的一次重大挑戰。截至目前,眾多教育行…

基于ssm+mysql的高校設備管理系統(含LW+PPT+源碼+系統演示視頻+安裝說明)

系統功能 管理員功能:系統登錄、員工管理、設備管理、設備采購統計、設備報廢統計;用戶角色功能:設備采購管理、設備報廢管理、個人資料管理。 作者:計算機搬磚家 開發技術:SpringBoot、php、Python、小程序、SSM、Vu…

電力桿塔安全監測解決方案

一、方案背景 在臺風、滑坡等自然災害出現時,極易產生倒桿、斷桿、桿塔傾斜、塔基滑動等致使桿塔失穩的狀況,進而引發導線斷線、線路跳閘等事故,給電網的安全穩定運行造成影響。可借助在鐵塔上裝設的傳感器,能夠感知鐵塔的工作狀態…

基于Quicker構建從截圖到公網圖像鏈接獲取的自動化流程

寫在前面:本博客僅作記錄學習之用,部分圖片來自網絡,如需引用請注明出處,同時如有侵犯您的權益,請聯系刪除! 文章目錄 前言預備內容轉webp程序PicGo設置Quicker設置視頻演示總結互動致謝參考 前言 在自建博…

Python Requests庫完全指南:從入門到精通

引言 在Python的生態系統中,requests庫以其簡潔優雅的API設計和強大的功能,成為HTTP請求處理領域的標桿工具。無論是數據爬蟲開發、API接口調用,還是自動化測試場景,requests都能將復雜的網絡交互簡化為幾行可讀性極高的代碼。相…

滲透測試核心技術:內網滲透與橫向移動

內網滲透是紅隊行動的關鍵階段,攻擊者通過突破邊界進入內網后,需快速定位域控、橫向移動并維持權限。本節從內網環境搭建、信息收集、橫向移動技巧到權限維持工具,系統講解如何在內網中隱蔽行動并擴大戰果。 1. 內網環境搭建與基礎配置 目標: 模擬真實企業網絡,構建包含…

學習FineBI

FineBI 第一章 FineBI 介紹 1.1. FineBI 概述 FineBI 是帆軟軟件有限公司推出的一款商業智能 (Business Intelligence) 產品 。 FineBI 是新一代大數據分析的 BI 工具 , 旨在幫助企業的業務人員充分了解和利用他們的數據 。FineBI 憑借強…

CSS 浮動(Float)及其應用

1. 什么是浮動(Float)? 浮動元素會脫離正常的文檔流(Document Flow),并向左或向右移動,直到碰到父元素的邊緣或另一個浮動元素。 基本語法 .float-left {float: left; }.float-right {float:…

二分算法的介紹簡單易懂

目錄 1.概論 2.樸素的二分算法 3.求左端點的二分算法和求右端點的二分算法 4.總結 1.概論 要想了解什么是二分算法,我們就要知道什么是二分算法,二分算法是根據數組的規律,每次查找的數據原來的效率可能要O(n),而我…

ROS2學習(3)------架構概述

操作系統:ubuntu22.04 IDE:Visual Studio Code 編程語言:C11 ROS版本:2 ROS 2(Robot Operating System 2)的設計旨在提供一個靈活、可擴展且高效的框架,用于編寫復雜的機器人軟件。它引入了發布者/訂閱者&…

墨水屏顯示模擬器程序解讀

程序如下&#xff1a;出處https://github.com/tsl0922/EPD-nRF5?tabreadme-ov-file // GUI emulator for Windows // This code is a simple Windows GUI application that emulates the display of an e-paper device. #include <windows.h> #include <stdint.h>…