為什么需要分布式id生成系統(tǒng)
在復(fù)雜分布式系統(tǒng)中,往往需要對大量的數(shù)據(jù)和消息進(jìn)行唯一標(biāo)識(shí)。如在美團(tuán)點(diǎn)評(píng)的金融、支付、餐飲、酒店、貓眼電影等產(chǎn)品的系統(tǒng)中,數(shù)據(jù)日漸增長,對數(shù)據(jù)分庫分表后需要有一個(gè)唯一ID來標(biāo)識(shí)一條數(shù)據(jù)或消息,數(shù)據(jù)庫的自增ID顯然不能滿足需求;特別一點(diǎn)的如訂單、騎手、優(yōu)惠券也都需要有唯一ID做標(biāo)識(shí)。此時(shí)一個(gè)能夠生成全局唯一ID的系統(tǒng)是非常必要的。概括下來,那業(yè)務(wù)系統(tǒng)對ID號(hào)的要求有哪些呢?
分布式id創(chuàng)建的業(yè)務(wù)需求
?
1.全局唯一性:不能出現(xiàn)重復(fù)的ID號(hào),既然是唯一標(biāo)識(shí),這是最基本的要求。
2.趨勢遞增:在MySQL
InnoDB引擎中使用的是聚集索引,由于多數(shù)RDBMS使用B-tree的數(shù)據(jù)結(jié)構(gòu)來存儲(chǔ)索引數(shù)據(jù),在主鍵的選擇上面我們應(yīng)該盡量使用有序的主鍵保證寫入性能。
3.單調(diào)遞增:保證下一個(gè)ID一定大于上一個(gè)ID,例如事務(wù)版本號(hào)、IM增量消息、排序等特殊需求。
4.信息安全:如果ID是連續(xù)的,惡意用戶的扒取工作就非常容易做了,直接按照順序下載指定URL即可;如果是訂單號(hào)就更危險(xiǎn)了,競對可以直接知道我們一天的單量。所以在一些應(yīng)用場景下,會(huì)需要ID無規(guī)則、不規(guī)則。
5.分布式id里面最好包含時(shí)間戳,這樣就能夠在開發(fā)中快速了解這個(gè)分布式id的生成時(shí)間
?
上述123對應(yīng)三類不同的場景,3和4需求還是互斥的,無法使用同一個(gè)方案滿足。
?
同時(shí)除了對ID號(hào)碼自身的要求,業(yè)務(wù)還對ID號(hào)生成系統(tǒng)的可用性要求極高,想象一下,如果ID生成系統(tǒng)癱瘓,整個(gè)美團(tuán)點(diǎn)評(píng)支付、優(yōu)惠券發(fā)券、騎手派單等關(guān)鍵動(dòng)作都無法執(zhí)行,這就會(huì)帶來一場災(zāi)難。由此我總結(jié)下一個(gè)ID生成系統(tǒng)應(yīng)該做到如下幾點(diǎn):
?
可用性高:就是我用戶發(fā)了一個(gè)獲取分布式id的請求,那么你服務(wù)器就要保證99.999%的情況下給我創(chuàng)建一個(gè)分布式id
延遲低:就是我用戶給你一個(gè)獲取分布式id的請求,那么你服務(wù)器給我創(chuàng)建一個(gè)分布式id的速度就要快
高QPS:這個(gè)就是用戶一下子有10萬個(gè)創(chuàng)建分布式id請求同時(shí)過去了,那么你服務(wù)器要頂?shù)淖。阋幌伦咏o我成功創(chuàng)建10萬個(gè)分布式id
分布式ID其他系列快捷鍵:
分布式ID系列(1)——為什么需要分布式ID以及分布式ID的業(yè)務(wù)需求
<https://www.cnblogs.com/itqiankun/p/11302604.html>
分布式ID系列(2)——UUID適合做分布式ID嗎 <https://www.cnblogs.com/itqiankun/p/11307738.html>?
分布式ID系列(3)——數(shù)據(jù)庫自增ID機(jī)制適合做分布式ID嗎
<https://www.cnblogs.com/itqiankun/p/11313412.html>
熱門工具 換一換