99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

UUID的弊端以及雪花算法簡析

Android編程精選 ? 來源:CSDN ? 2023-03-23 09:33 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、問題

為什么需要分布式全局唯一ID以及分布式ID的業(yè)務(wù)需求

在復(fù)雜分布式系統(tǒng)中,往往需要對大量的數(shù)據(jù)和消息進(jìn)行唯一標(biāo)識

如在美團(tuán)點(diǎn)評的金融、支付、餐飲、酒店;

貓眼電影等產(chǎn)品的系統(tǒng)中數(shù)據(jù)日漸增長,對數(shù)據(jù)分庫分表后需要有一個(gè)唯一ID來標(biāo)識一條數(shù)據(jù)或消息;

特別一點(diǎn)的如訂單、騎手、優(yōu)惠券也都需要有唯一ID做標(biāo)識。

此時(shí)一個(gè)能夠生成全局唯一ID的系統(tǒng)是非常必要的

ID生成規(guī)則部分硬性要求

①全局唯一

即不能出現(xiàn)重復(fù)ID號

②趨勢遞增

在Mysql的InnoDB引擎中使用的是聚集索引,由于多數(shù)RDBMS使用的是BTree的數(shù)據(jù)結(jié)構(gòu)作為存儲索引數(shù)據(jù),在主鍵的選擇上我們應(yīng)該盡量使用有序的主鍵保證寫入性能

③單調(diào)遞增

保證下一個(gè)ID一定大于上一個(gè)ID,如事務(wù)版本號、排序等特殊要求

④信息安全

如果ID是連續(xù)的,惡意用戶的扒取工作就非常容易做了,直接按照順序下載指定URL即可:如果是訂單號就更危險(xiǎn)了,競對可以直接知道我們一天的單量。所以在一些應(yīng)用場景下,需要ID無規(guī)則不規(guī)則,讓競爭對手不好猜

⑤含時(shí)間戳

在開發(fā)中能快速了解這個(gè)分布式id生成的時(shí)間

ID號生成系統(tǒng)的可用性要求

①高可用

發(fā)一個(gè)獲取分布式ID的請求,服務(wù)器要保證99.999%的情況下能給我返回一個(gè)分布式ID

②低延遲

返回的速度要快

③高QPS(抵抗高訪問)

比如一秒內(nèi)10萬個(gè),需要服務(wù)器能抵抗住并且生成10萬個(gè)分布式ID

二、一般通用方案

(一)UUID

jdk自帶,生成36位字符,形式為8-4-4-4-12,包含4個(gè)連號-,對于單體式僅需滿足唯一的話可以使用

好處:性能高,本地生成,無網(wǎng)絡(luò)消耗

壞處:無序且字符串長,存入數(shù)據(jù)庫會增大數(shù)據(jù)庫壓力,入數(shù)據(jù)庫性能差。mysql官方推薦主鍵越短越好

索引, B+樹索引的分裂

既然分布式id是主鍵,然后主鍵是包含索引的,然后mysql的索引是通過b+樹來實(shí)現(xiàn)的,每一次新的UUID數(shù)據(jù)的插入,為了查詢的優(yōu)化,都會對索引底層的b+樹進(jìn)行修改,因?yàn)閁UID數(shù)據(jù)是無序的。

所以每一次UUID數(shù)據(jù)的插入都會對主鍵地的b+樹進(jìn)行很大的修改,這一點(diǎn)很不好。插入完全無序,不但會導(dǎo)致一些中間節(jié)點(diǎn)產(chǎn)生分裂,也會白白創(chuàng)造出很多不飽和的節(jié)點(diǎn),這樣大大降低了數(shù)據(jù)庫插入的性能

(二)數(shù)據(jù)庫自增主鍵

數(shù)據(jù)庫自增主鍵實(shí)現(xiàn)原理:數(shù)據(jù)庫自增id和replace into實(shí)現(xiàn)的

REPLACE INTO的含義是插入一條記錄,如果表中唯一索引的值遇到?jīng)_突,則替換老數(shù)據(jù)

那數(shù)據(jù)庫自增ID機(jī)制適合作分布式ID嗎? 答案是不太適合

系統(tǒng)水平擴(kuò)展比較困難,比如定義好了步長和機(jī)器臺數(shù)之后,如果要添加機(jī)器該怎么做? 假設(shè)現(xiàn)在只有一臺機(jī)器發(fā)號是1,2.3.4.5(步長是1),這個(gè)時(shí)候需要擴(kuò)容機(jī)器一臺??梢赃@樣做,把第二臺機(jī)器的初始值設(shè)置得比第一臺超過很多,貌似還好,現(xiàn)在想象一下如果我們線上有100臺機(jī)器,這個(gè)時(shí)候要擴(kuò)容該怎么做? 簡直是噩夢。所以系統(tǒng)水平擴(kuò)展方案復(fù)雜難以實(shí)現(xiàn)。

數(shù)據(jù)庫壓力還是很大,每次獲取ID都得讀寫一次數(shù)據(jù)庫,非常影響性能,不符合分布式ID里面的延遲低和要高QPS的規(guī)則(在高并發(fā)下,如果都去數(shù)據(jù)庫里面獲取id,那是非常影響性能的)

(三)Redis生成全局id策略

因?yàn)镽edis是單線的天生保證原子性,可以使用原子操作INCR和INCRBY來實(shí)現(xiàn)

注意:在Redis集群情況下,同樣和MySQL一樣需要設(shè)置不同的增長步長,同時(shí)key一定要設(shè)置有效期

可以使用Redis集群來獲取更高的吞吐量。

假如一個(gè)集群中有5臺Redis??梢猿跏蓟颗_Redis的值分別是1,2,3,4,5,然后步長都是5。

各個(gè)Redis生成的ID為:

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

三、snowflake

(一)概述

Twitter的分布式自增ID算法

特點(diǎn):

① 能夠按照時(shí)間有序生成

②Snowflake算法生成id的結(jié)果是一個(gè)64bit大小的整數(shù),為一個(gè)Long型,轉(zhuǎn)化為字符串最多19位

③分布式系統(tǒng)內(nèi)不會產(chǎn)生ID碰撞(由datacenter和workerld作區(qū)分) 并且效率較高。

(二)結(jié)構(gòu)

15735098-c8d6-11ed-bfe3-dac502259ad0.png

bit表示+-,id一般為正,所以固定為0

時(shí)間戳位范圍為0-2^41次方,大概是可以使用69年(從1970算起)

工作進(jìn)程位最多為2^10,即1024個(gè)節(jié)點(diǎn),包括5位datacenter和5位workerld作區(qū)分

12bit-序列號,序列號,用來記錄同毫秒內(nèi)產(chǎn)生的不同id。12位(bit) 可以表示的最大正整數(shù)是2^12-1=4059

(三)代碼

/**
*Twitter_Snowflake
*SnowFlake的結(jié)構(gòu)如下(每部分用-分開):
*0-00000000000000000000000000000000000000000-00000-00000-000000000000
*1位標(biāo)識,由于long基本類型在Java中是帶符號的,最高位是符號位,正數(shù)是0,負(fù)數(shù)是1,所以id一般是正數(shù),最高位是0
*41位時(shí)間截(毫秒級),注意,41位時(shí)間截不是存儲當(dāng)前時(shí)間的時(shí)間截,而是存儲時(shí)間截的差值(當(dāng)前時(shí)間截-開始時(shí)間截) *得到的值),這里的的開始時(shí)間截,一般是我們的id生成器開始使用的時(shí)間,由我們程序來指定的(如下下面程序IdWorker類的startTime屬性)。41位的時(shí)間截,可以使用69年,年T =(1L << 41)?/?(1000L * 60?* 60?* 24 * 365)?= 69
*10位的數(shù)據(jù)機(jī)器位,可以部署在1024個(gè)節(jié)點(diǎn),包括5位datacenterId和5位workerId
*12位序列,毫秒內(nèi)的計(jì)數(shù),12位的計(jì)數(shù)順序號支持每個(gè)節(jié)點(diǎn)每毫秒(同一機(jī)器,同一時(shí)間截)產(chǎn)生4096個(gè)ID序號
*加起來剛好64位,為一個(gè)Long型。
* SnowFlake的優(yōu)點(diǎn)是,整體上按照時(shí)間自增排序,并且整個(gè)分布式系統(tǒng)內(nèi)不會產(chǎn)生ID碰撞(由數(shù)據(jù)中心ID和機(jī)器ID作區(qū)分),并且效率較高,經(jīng)測試,SnowFlake每秒能夠產(chǎn)生26萬ID左右。 */ publicclassSnowflakeIdWorker{ //==============================Fields=========================================== /**開始時(shí)間截(2020-08-28)*/ privatefinallongtwepoch=1598598185157L; /**機(jī)器id所占的位數(shù)*/ privatefinallongworkerIdBits=5L; /**數(shù)據(jù)標(biāo)識id所占的位數(shù)*/ privatefinallongdatacenterIdBits=5L; /**支持的最大機(jī)器id,結(jié)果是31(這個(gè)移位算法可以很快的計(jì)算出幾位二進(jìn)制數(shù)所能表示的最大十進(jìn)制數(shù))*/ privatefinallongmaxWorkerId=-1L^(-1L<maxWorkerId||workerIdmaxDatacenterId||datacenterId

(四)優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

毫秒數(shù)在高位,自增序列在低位,整個(gè)ID都是趨勢遞增的。不依賴數(shù)據(jù)庫等第三方系統(tǒng),以服務(wù)的方式部署,穩(wěn)定性更高,生成ID的性能也是非常高的??梢愿鶕?jù)自身業(yè)務(wù)特性分配bit位,非常靈活。

缺點(diǎn):

依賴機(jī)器時(shí)鐘,如果機(jī)器時(shí)鐘回?fù)?,會?dǎo)致重復(fù)ID生成在單機(jī)上是遞增的,但是由于設(shè)計(jì)到分布式環(huán)境,每臺機(jī)器上的時(shí)鐘不可能完全同步,有時(shí)候會出現(xiàn)不是全局遞增的情況(此缺點(diǎn)可以認(rèn)為無所謂,一般分布式ID只要求趨勢遞增,并不會亞格要求遞增,90%的需求都只要求趨勢遞增)

缺點(diǎn)的解決方案

可以參照以下兩個(gè)來進(jìn)行機(jī)器時(shí)鐘的同步

百度開源的分布式唯一ID生成器UidGenerator

Leaf--美團(tuán)點(diǎn)評分布式ID生成系統(tǒng)






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • URL
    URL
    +關(guān)注

    關(guān)注

    0

    文章

    141

    瀏覽量

    15869
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    860

    瀏覽量

    27948
  • QPS
    QPS
    +關(guān)注

    關(guān)注

    0

    文章

    24

    瀏覽量

    8953
  • RDBMS
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    5957
  • UUID
    +關(guān)注

    關(guān)注

    0

    文章

    23

    瀏覽量

    8366

原文標(biāo)題:UUID的弊端以及雪花算法

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    新能源電池產(chǎn)業(yè)鏈及投資機(jī)會-磷酸亞鐵鋰

    新能源電池產(chǎn)業(yè)鏈及投資機(jī)會-磷酸亞鐵鋰  一、前言
    發(fā)表于 12-25 09:34 ?1102次閱讀

    CC2541如何在廣播中帶上service uuid以及characteristics的uuid和屬性?

    請問各位大俠,CC2541如何在廣播中帶上service uuid以及characteristics的uuid和屬性?
    發(fā)表于 04-25 14:19

    基于ATM理念的UTRAN傳輸架構(gòu)

    基于ATM理念的UTRAN傳輸架構(gòu):UTRAN(UMTS無線接入網(wǎng))系統(tǒng)傳輸網(wǎng)承載其內(nèi)部業(yè)務(wù)傳送及至CN(核心網(wǎng))側(cè)的業(yè)務(wù)匯聚功能,考慮3G網(wǎng)絡(luò)內(nèi),話音、媒體流及Internet等數(shù)據(jù)業(yè)務(wù)的多樣
    發(fā)表于 10-22 10:49 ?15次下載

    電動汽車用鋰離子電池技術(shù)的國內(nèi)外進(jìn)展

    電動汽車用鋰離子電池技術(shù)的國內(nèi)外進(jìn)展
    發(fā)表于 11-10 13:53 ?865次閱讀

    PCB線路板電鍍銅工藝

    PCB線路板電鍍銅工藝   一.電鍍工藝的分類:   酸性光亮銅電鍍電鍍鎳/金電鍍錫   二.工藝流程:
    發(fā)表于 11-17 14:01 ?4375次閱讀

    EPON技術(shù)

    EPON技術(shù) EPON是一個(gè)新技術(shù),用于保證提供一個(gè)高品質(zhì)與高帶寬利用率的應(yīng)用。   EPON在日本、韓國、中國大陸、中國臺灣及其它以以太網(wǎng)絡(luò)為基礎(chǔ)的地區(qū)都
    發(fā)表于 01-22 10:43 ?991次閱讀

    筆記本屏幕亮度與反應(yīng)速度

    筆記本屏幕亮度與反應(yīng)速度 屏幕亮度   筆記本TFT-LCD的亮度值一般都在150~200 cd/m2(極少數(shù)可以
    發(fā)表于 01-23 09:34 ?869次閱讀

    BGA封裝技術(shù)與質(zhì)量控制

    BGA封裝技術(shù)與質(zhì)量控制   SMT(Surface Mount Technology)表面安裝技術(shù)順應(yīng)了電子產(chǎn)品小型化、輕型化的潮流趨勢,為實(shí)現(xiàn)電子
    發(fā)表于 03-30 16:49 ?1645次閱讀

    鼠標(biāo)HID例程(中)

    鼠標(biāo) HID 例程 緊接《鼠標(biāo) HID 例程(上)》一文,繼續(xù)向大家介紹鼠 標(biāo) HID 例程的未完的內(nèi)容。
    發(fā)表于 07-26 15:18 ?0次下載

    籠型三相異步電動機(jī)噪聲故障

    籠型三相異步電動機(jī)噪聲故障_陳金剛
    發(fā)表于 01-01 15:44 ?1次下載

    比較器的原理及應(yīng)用資料下載

    電子發(fā)燒友網(wǎng)為你提供比較器的原理及應(yīng)用資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計(jì)、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發(fā)表于 04-14 08:40 ?27次下載
    <b class='flag-5'>簡</b><b class='flag-5'>析</b>比較器的原理及應(yīng)用資料下載

    為什么不選擇UUID?UUID有哪些特性

    這里面常用的就是 UUID4 了,但是,即使是隨機(jī)的,但是也是存在沖突的風(fēng)險(xiǎn)。和 UUID 要么基于隨機(jī)數(shù),要么基于時(shí)間戳不同,ULID 是既基于時(shí)間戳又基于隨機(jī)數(shù),時(shí)間戳精確到毫秒,毫秒內(nèi)有1.21e + 24個(gè)隨機(jī)數(shù),不存在沖突的風(fēng)險(xiǎn),而且轉(zhuǎn)換成字符串比
    的頭像 發(fā)表于 10-13 10:29 ?1485次閱讀

    5G AAU 功放控制和監(jiān)測模塊

    5G AAU 功放控制和監(jiān)測模塊
    發(fā)表于 10-28 12:00 ?2次下載
    5G AAU 功放控制和監(jiān)測模塊<b class='flag-5'>簡</b><b class='flag-5'>析</b>

    雪花算法搞了唯一ID生成,結(jié)果上線就引發(fā)了故障

    初步排查 :報(bào)錯(cuò)信息為duplicate key,意思是保存數(shù)據(jù)的時(shí)候,報(bào)主鍵 id 重復(fù),而這些 id 都是由雪花算法生成的,按道理來說,雪花算法生成的 ID 是唯一 ID,不應(yīng)該出
    的頭像 發(fā)表于 01-29 10:41 ?7620次閱讀

    AFE8092幀同步特性

    AFE8092幀同步特性
    的頭像 發(fā)表于 08-24 13:37 ?963次閱讀
    AFE8092幀同步特性<b class='flag-5'>簡</b><b class='flag-5'>析</b>