游戲服務器架構系列 - 分布式ID生成

為什么要生成分布式ID判族?

在復雜分布式系統(tǒng)中躺盛,往往需要對大量的數(shù)據(jù)和消息進行唯一標識。例如在游戲中形帮,游戲數(shù)據(jù)日漸增長槽惫,對數(shù)據(jù)分庫分表后需要有一個唯一ID來標識一條數(shù)據(jù)或消息周叮,數(shù)據(jù)庫的自增ID顯然不能滿足需求,那業(yè)務系統(tǒng)對ID號的要求有哪些呢界斜?

1)全局唯一性:不能出現(xiàn)重復的ID號仿耽,既然是唯一標識,這是最基本的要求各薇。

2)趨勢遞增:在MySQL InnoDB引擎中使用的是聚集索引项贺,由于多數(shù)RDBMS使用B-tree的數(shù)據(jù)結構來存儲索引數(shù)據(jù),在主鍵的選擇上面我們應該盡量使用有序的主鍵保證寫入性能峭判。

3)單調(diào)遞增:保證下一個ID一定大于上一個ID开缎,例如事務版本號、IM增量消息林螃、排序等特殊需求奕删。

4)信息安全:如果ID是連續(xù)的,惡意用戶的扒取工作就非常容易做了治宣,直接按照順序下載指定URL即可急侥;如果是訂單號就更危險了,競對可以直接知道我們一天的單量。所以在一些應用場景下派草,會需要ID無規(guī)則再愈、不規(guī)則。

1铝宵、UUID

使用網(wǎng)卡地址、時間戳和隨機數(shù)進行生成唯一ID华畏,Java中就自帶生成UUID的方法鹏秋。

優(yōu)點:本地即可生成,不需要網(wǎng)絡開銷

缺點:字符串占用內(nèi)存亡笑,不自增侣夷,對數(shù)據(jù)庫索引不友好,MySQL官方推薦不要使用

2仑乌、snowflake算法

1位:保留位不用百拓。二進制中最高位為1的都是負數(shù),但是我們生成的id一般都使用整數(shù)晰甚,所以這個最高位固定是0

41位:用來記錄時間戳(毫秒)衙传,41位可以表示2^41?1個數(shù)字,(2^41?1)/(1000?60?60?24?365)=69年

10位:用來記錄工作機器id

12位:序列號厕九,用來記錄同毫秒內(nèi)產(chǎn)生的不同id

優(yōu)點:存在自增趨勢蓖捶,只占用64位

缺點:強依賴機器時鐘

3、Flicker公司的解決方案

使用MySQL的auto_increment自增特性來生成唯一ID扁远。

創(chuàng)建優(yōu)惠券表:

CREATETABLEDiscount (idbigint(20)unsignedNOTNULLauto_increment,stubchar(1)NOTNULLdefault'',PRIMARYKEY(id),UNIQUEKEYstub (stub))ENGINE=InnoDB

獲取ID: 在一個事務中執(zhí)行如下sql俊鱼,replace和insert語句區(qū)別主要是replace在插入數(shù)據(jù)的時候刻像,如果數(shù)據(jù)存在(通過主鍵和唯一索引來查找)則先刪除,然后再進行插入亭引。

START TRANSACTION;

REPLACE INTO Tickets64 (stub) VALUES ('a');

SELECT LAST_INSERT_ID();

COMMIT;

上面這種方法只在單臺MySQL上生成ID绎速,從高可用角度考慮,接下來就要解決單點故障問題:可以啟用兩臺數(shù)據(jù)庫服務器來生成ID焙蚓,通過區(qū)分auto_increment的起始值和步長來生成奇偶數(shù)的ID纹冤。

DiscountServer1// 優(yōu)惠券服務1

auto-increment-increment =2// 自增值

auto-increment-offset =1// 起始值

DiscountServer2// 優(yōu)惠券服務2

auto-increment-increment =2// 自增

auto-increment-offset =2// 起始值

優(yōu)點:充分借助數(shù)據(jù)庫的自增ID機制,提供高可靠性购公,生成的ID有序萌京。

缺點:強依賴數(shù)據(jù)庫,占用兩個獨立的MySQL實例宏浩,有些浪費資源知残,成本較高,而且增刪MySQL實例很復雜比庄。

4求妹、MongoDB的ObjectId

MongoDB中我們經(jīng)常會接觸到一個自動生成的字段:”_id”,類型為ObjectId佳窑。上面方法中用到了MySQL數(shù)據(jù)庫時制恍,主鍵都是設置成自增的。但在分布式環(huán)境下神凑,這種方法就不可行了净神,會產(chǎn)生沖突。為此溉委,MongoDB采用了一個稱之為ObjectId的類型來做主鍵鹃唯。ObjectId是一個12字節(jié)的 BSON 類型字符串。

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

前9個字節(jié)保證了同一秒不同機器不同進程產(chǎn)生的ObjectId的唯一性瓣喊。后三個字節(jié)是一個自動增加的計數(shù)器(一個mongod進程需要一個全局的計數(shù)器)坡慌,保證同一秒的ObjectId是唯一的。同一秒鐘最多允許每個進程擁有(256^3 = 16777216)個不同的ObjectId藻三。

優(yōu)點:算法實現(xiàn)思路和snowflake類似八匠,但是相比更消耗空間

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市趴酣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坑夯,老刑警劉巖岖寞,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異柜蜈,居然都是意外死亡仗谆,警方通過查閱死者的電腦和手機指巡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來隶垮,“玉大人藻雪,你說我怎么就攤上這事±晖蹋” “怎么了勉耀?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蹋偏。 經(jīng)常有香客問我便斥,道長,這世上最難降的妖魔是什么威始? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任枢纠,我火速辦了婚禮,結果婚禮上黎棠,老公的妹妹穿的比我還像新娘晋渺。我一直安慰自己,他們只是感情好脓斩,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布木西。 她就那樣靜靜地躺著,像睡著了一般俭厚。 火紅的嫁衣襯著肌膚如雪户魏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天挪挤,我揣著相機與錄音叼丑,去河邊找鬼。 笑死扛门,一個胖子當著我的面吹牛鸠信,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播论寨,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼星立,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了葬凳?” 一聲冷哼從身側響起绰垂,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎火焰,沒想到半個月后劲装,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年占业,在試婚紗的時候發(fā)現(xiàn)自己被綠了绒怨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡谦疾,死狀恐怖南蹂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情念恍,我是刑警寧澤六剥,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站樊诺,受9級特大地震影響仗考,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜词爬,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一秃嗜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧顿膨,春花似錦锅锨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至囊咏,卻和暖如春恕洲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背梅割。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工霜第, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人户辞。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓泌类,卻偏偏與公主長得像,于是被迫代替她去往敵國和親底燎。 傳聞我的和親對象是個殘疾皇子刃榨,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 關于Mongodb的全面總結 MongoDB的內(nèi)部構造《MongoDB The Definitive Guide》...
    中v中閱讀 31,905評論 2 89
  • 一,題記 所有的業(yè)務系統(tǒng)双仍,都有生成ID的需求枢希,如訂單id,商品id朱沃,文章ID等晴玖。這個ID會是數(shù)據(jù)庫中的唯一主鍵,在...
    eonhu閱讀 9,035評論 0 8
  • 一,題記 所有的業(yè)務系統(tǒng)呕屎,都有生成ID的需求,如訂單id敬察,商品id秀睛,文章ID等。這個ID會是數(shù)據(jù)庫中的唯一主鍵莲祸,在...
    架構師小秘圈閱讀 4,040評論 1 18
  • 這篇文章總結了分布式主鍵或者唯一鍵的生成算法蹂安,文章最后有我們基于snowflow算法的思考和實踐。 分布式主鍵的生...
    彥幀閱讀 2,680評論 0 5
  • MYSQL 基礎知識 1 MySQL數(shù)據(jù)庫概要 2 簡單MySQL環(huán)境 3 數(shù)據(jù)的存儲和獲取 4 MySQL基本操...
    Kingtester閱讀 7,787評論 5 116