偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

基于分布式系統(tǒng)的7種唯一ID實現(xiàn)方案,值得收藏

運維 數(shù)據(jù)庫運維 前端 分布式
系統(tǒng)唯一ID是我們在設(shè)計一個系統(tǒng)的時候常常會遇見的問題,也常常為這個問題而糾結(jié)。生成ID的方法有很多,適應(yīng)不同的場景、需求以及性能要求。所以有些比較復(fù)雜的系統(tǒng)會有多個ID生成的策略。

 概述

系統(tǒng)唯一ID是我們在設(shè)計一個系統(tǒng)的時候常常會遇見的問題,也常常為這個問題而糾結(jié)。生成ID的方法有很多,適應(yīng)不同的場景、需求以及性能要求。所以有些比較復(fù)雜的系統(tǒng)會有多個ID生成的策略。

[[275648]]

分布式ID的特性

  • 唯一性:確保生成的ID是全網(wǎng)唯一的。
  • 有序遞增性:確保生成的ID是對于某個用戶或者業(yè)務(wù)是按一定的數(shù)字有序遞增的。
  • 高可用性:確保任何時候都能正確的生成ID。
  • 帶時間:ID里面包含時間,一眼掃過去就知道哪天的交易。

下面介紹幾種分布式ID的生成方案。

1、數(shù)據(jù)庫自增長序列或字段

最常見的方式。利用數(shù)據(jù)庫,全數(shù)據(jù)庫唯一。

優(yōu)點:

1)簡單,代碼方便,性能可以接受。

2)數(shù)字ID天然排序,對分頁或者需要排序的結(jié)果很有幫助。

缺點:

1)不同數(shù)據(jù)庫語法和實現(xiàn)不同,數(shù)據(jù)庫遷移的時候或多數(shù)據(jù)庫版本支持的時候需要處理。

2)在單個數(shù)據(jù)庫或讀寫分離或一主多從的情況下,只有一個主庫可以生成。有單點故障的風險。

3)在性能達不到要求的情況下,比較難于擴展。

4)如果遇見多個系統(tǒng)需要合并或者涉及到數(shù)據(jù)遷移會相當痛苦。

5)分表分庫的時候會有麻煩。

優(yōu)化方案:

針對主庫單點,如果有多個Master庫,則每個Master庫設(shè)置的起始數(shù)字不一樣,步長一樣,可以是Master的個數(shù)。比如:Master1 生成的是 1,4,7,10,Master2生成的是2,5,8,11 Master3生成的是 3,6,9,12。這樣就可以有效生成集群中的唯一ID,也可以大大降低ID生成數(shù)據(jù)庫操作的負載。

2、UUID

常見的方式??梢岳脭?shù)據(jù)庫也可以利用程序生成,一般來說全球唯一。

優(yōu)點:

1)簡單,代碼方便。

2)生成ID性能非常好,基本不會有性能問題。

3)全球唯一,在遇見數(shù)據(jù)遷移,系統(tǒng)數(shù)據(jù)合并,或者數(shù)據(jù)庫變更等情況下,可以從容應(yīng)對。

缺點:

1)沒有排序,無法保證趨勢遞增。

2)UUID往往是使用字符串存儲,查詢的效率比較低。

3)存儲空間比較大,如果是海量數(shù)據(jù)庫,就需要考慮存儲量的問題。

4)傳輸數(shù)據(jù)量大

5)不可讀。

3、批量生成ID

一次按需批量生成多個ID,每次生成都需要訪問數(shù)據(jù)庫,將數(shù)據(jù)庫修改為最大的ID值,并在內(nèi)存中記錄當前值及最大值。

優(yōu)點:

避免了每次生成ID都要訪問數(shù)據(jù)庫并帶來壓力,提高性能

缺點:

屬于本地生成策略,存在單點故障,服務(wù)重啟造成ID不連續(xù)

4、Redis生成ID

當使用數(shù)據(jù)庫來生成ID性能不夠要求的時候,可以嘗試使用Redis來生成ID。這主要依賴于Redis是單線程的,所以也可以用生成全局唯一的ID。可以用Redis的原子操作 INCR和INCRBY來實現(xiàn)。

可以使用Redis集群來獲取更高的吞吐量。假如一個集群中有5臺Redis??梢猿跏蓟颗_Redis的值分別是1,2,3,4,5,然后步長都是5。各個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

這個,隨便負載到哪個機確定好,未來很難做修改。但是3-5臺服務(wù)器基本能夠滿足器上,都可以獲得不同的ID。但是步長和初始值一定需要事先需要了。使用Redis集群也可以方式單點故障的問題。

另外,比較適合使用Redis來生成每天從0開始的流水號。比如訂單號=日期+當日自增長號??梢悦刻煸赗edis中生成一個Key,使用INCR進行累加。

優(yōu)點:

1)不依賴于數(shù)據(jù)庫,靈活方便,且性能優(yōu)于數(shù)據(jù)庫。

2)數(shù)字ID天然排序,對分頁或者需要排序的結(jié)果很有幫助。

缺點:

1)如果系統(tǒng)中沒有Redis,還需要引入新的組件,增加系統(tǒng)復(fù)雜度。

2)需要編碼和配置的工作量比較大。

5、Twitter的snowflake算法(目前我們在使用的)

snowflake是Twitter開源的分布式ID生成算法,結(jié)果是一個long型的ID。雪花算法將生成不高于19位的有序Long型整數(shù),多用于分布式環(huán)境的數(shù)據(jù)主鍵。


其核心思想是:使用41bit作為毫秒數(shù),10bit作為機器的ID(5個bit是數(shù)據(jù)中心,5個bit的機器ID),12bit作為毫秒內(nèi)的流水號(意味著每個節(jié)點在每毫秒可以產(chǎn)生 4096 個 ID),最后還有一個符號位,永遠是0。


snowflake算法可以根據(jù)自身項目的需要進行一定的修改。比如估算未來的數(shù)據(jù)中心個數(shù),每個數(shù)據(jù)中心的機器數(shù)以及統(tǒng)一毫秒可以能的并發(fā)數(shù)來調(diào)整在算法中所需要的bit數(shù)。

優(yōu)點:

1)不依賴于數(shù)據(jù)庫,靈活方便,且性能優(yōu)于數(shù)據(jù)庫。

2)ID按照時間在單機上是遞增的。

缺點:

在單機上是遞增的,但是由于涉及到分布式環(huán)境,每臺機器上的時鐘不可能完全同步,也許有時候也會出現(xiàn)不是全局遞增的情況。

6、利用zookeeper生成唯一ID

zookeeper主要通過其znode數(shù)據(jù)版本來生成序列號,可以生成32位和64位的數(shù)據(jù)版本號,客戶端可以使用這個版本號來作為唯一的序列號。

很少會使用zookeeper來生成唯一ID。主要是由于需要依賴zookeeper,并且是多步調(diào)用API,如果在競爭較大的情況下,需要考慮使用分布式鎖。因此,性能在高并發(fā)的分布式環(huán)境下,也不甚理想。

7、 MongoDB的ObjectId

MongoDB的ObjectId和snowflake算法類似。它設(shè)計成輕量型的,不同的機器都能用全局唯一的同種方法方便地生成它。MongoDB 從一開始就設(shè)計用來作為分布式數(shù)據(jù)庫,處理多個節(jié)點是一個核心要求。使其在分片環(huán)境中要容易生成得多。

MongoDB 中我們經(jīng)常會接觸到一個自動生成的字段:"_id",類型為ObjectId。

之前我們使用MySQL等關(guān)系型數(shù)據(jù)庫時,主鍵都是設(shè)置成自增的。但在分布式環(huán)境下,這種方法就不可行了,會產(chǎn)生沖突。為此,mongodb采用了一個稱之為ObjectId的類型來做主鍵。ObjectId是一個12字節(jié)的 BSON 類型字符串。按照字節(jié)順序,一次代表:

  • 4字節(jié):UNIX時間戳
  • 3字節(jié):表示運行MongoDB的機器
  • 2字節(jié):表示生成此_id的進程
  • 3字節(jié):由一個隨機數(shù)開始的計數(shù)器生成的值

為了確保在同一臺機器上并發(fā)的多個進程產(chǎn)生的ObjectId 是唯一的,接下來的兩字節(jié)來自產(chǎn)生ObjectId 的進程標識符(PID)。


ObjetId的12字節(jié)

前9 字節(jié)保證了同一秒鐘不同機器不同進程產(chǎn)生的ObjectId 是唯一的。后3 字節(jié)就是一個自動增加的計數(shù)器,確保相同進程同一秒產(chǎn)生的ObjectId 也是不一樣的。同一秒鐘最多允許每個進程擁有2563(16777216)個不同的ObjectId。

責任編輯:華軒 來源: 今日頭條
相關(guān)推薦

2021-06-05 07:33:09

ID分布式架構(gòu)

2021-06-28 14:45:07

分布式框架操作

2021-11-08 19:25:37

Go生成系統(tǒng)

2022-02-23 07:09:30

分布式ID雪花算法

2023-09-03 22:14:23

分布式ID

2023-01-06 09:19:12

Seata分布式事務(wù)

2022-09-28 07:58:06

MongoDB分布式ID

2024-02-02 10:57:12

Java分布式算法

2021-07-02 06:54:43

分布式環(huán)境ID

2023-01-12 17:46:37

分庫分表id如何生成

2023-12-13 09:35:52

算法分布式

2023-03-05 18:23:38

分布式ID節(jié)點

2020-05-12 11:38:08

存儲架構(gòu)分布式

2017-04-12 09:29:02

HiveMapReduceSpark

2024-09-18 00:00:10

UUID識別碼標志符

2024-10-31 13:51:58

2017-04-13 10:51:09

Consul分布式

2020-07-21 11:35:21

開發(fā)技能代碼

2024-11-19 15:55:49

2023-04-03 10:00:00

Redis分布式
點贊
收藏

51CTO技術(shù)棧公眾號