JAVA互聯(lián)網(wǎng)架構(gòu)分庫(kù)分表分布式下如何實(shí)現(xiàn)ID全局唯一性?
分庫(kù)分表:
跨庫(kù)的問(wèn)題
分布式事務(wù)問(wèn)題
查詢數(shù)據(jù)結(jié)果集合并
全局唯一性ID保證
要求:
1、全局唯一性:不能出現(xiàn)重復(fù)的id號(hào)(基本的要求)。
2、信息安全:防止惡意用戶規(guī)矩id的規(guī)則來(lái)獲取數(shù)據(jù)。混淆效果
3、數(shù)據(jù)遞增:保證我下一個(gè)ID一定大于上一個(gè)ID。
當(dāng)前201709122030下一個(gè):201709122031下一個(gè):201709122032
互斥關(guān)系:信息安全、數(shù)據(jù)遞增規(guī)律
CREATE TABLE `tl_id` (`id` varchar(255) NOT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
業(yè)界分案:
UUID:
通用唯一識(shí)別碼16個(gè)字節(jié)128位的長(zhǎng)數(shù)字、
組成部分:當(dāng)前日期和時(shí)間序列+全局的唯一性網(wǎng)卡mac地址
執(zhí)行任務(wù)數(shù):10000------------------------所有線程共耗時(shí):38.305 s并發(fā)執(zhí)行完耗時(shí):449.0 ms單任務(wù)平均耗時(shí):3.8305 ms單線程最小耗時(shí):0.0 ms單線程最大耗時(shí):193.0 ms
總結(jié):
優(yōu)點(diǎn)代碼實(shí)現(xiàn)簡(jiǎn)單、不占用寬帶、數(shù)據(jù)遷移不受影響
缺點(diǎn)無(wú)序、無(wú)法保證趨勢(shì)遞增(要求3)字符存儲(chǔ)、傳輸、查詢慢、不可讀
Snowflake雪花算法
國(guó)外的twitter分布式下iD生成算法
1bit+41bit+10bit+10+bit=62bit
高位隨機(jī)+毫秒數(shù)+機(jī)器碼(數(shù)據(jù)中心+機(jī)器id)+10的流水號(hào)
國(guó)內(nèi):
保證數(shù)據(jù)的唯一性就行了IDC機(jī)房。
總結(jié):
優(yōu)點(diǎn)代碼實(shí)現(xiàn)簡(jiǎn)單、不占用寬帶、數(shù)據(jù)遷移不受影響、低位趨勢(shì)遞增缺點(diǎn)強(qiáng)以來(lái)時(shí)鐘(多臺(tái)服務(wù)器時(shí)間一定要一樣)、無(wú)序無(wú)法保證趨勢(shì)遞增(要求3)
Mysql:
奇數(shù)跟我們偶數(shù)遞增步長(zhǎng)2
適合小型互聯(lián)網(wǎng)公司、比如可以知道我們一定生成的ID數(shù)量 五萬(wàn)的訂單量
一年1千8百萬(wàn)
Mysql一張表500萬(wàn)
如果公司每天訂單量5萬(wàn)的數(shù)據(jù) 我們用mysql設(shè)置步長(zhǎng)位100的話可以用27年
只能為100庫(kù) 公司來(lái)到風(fēng)投了 每天的訂單量50萬(wàn)100萬(wàn)的時(shí)候
總結(jié):
優(yōu)點(diǎn)代碼實(shí)現(xiàn)方便、性能不錯(cuò)、數(shù)字排序、可讀性很強(qiáng)缺點(diǎn)受限數(shù)據(jù)庫(kù)、擴(kuò)展麻煩、插入數(shù)據(jù)庫(kù)才能拿到ID、單點(diǎn)故障的問(wèn)題
主從同步的時(shí)候:電商下單->支付insert master db select數(shù)據(jù) 因?yàn)閿?shù)據(jù)同步延遲導(dǎo)致查不到這個(gè)數(shù)據(jù)。加cache(不是最好的解決方式)數(shù)據(jù)要求比較嚴(yán)謹(jǐn)?shù)脑挷閙aster主庫(kù)。
CREATE TABLE `tl_num` (
`id` bigint(11) NOT NULL AUTO_INCREMENT,
KEY (`id`) USING BTREE
) ENGINE=InnoDB auto_increment=1 DEFAULT CHARSET=utf8;
Redis:
執(zhí)行任務(wù)數(shù):10000------------------------所有線程共耗時(shí):136.587 s并發(fā)執(zhí)行完耗時(shí):1.515 s單任務(wù)平均耗時(shí):13.6587 ms單線程最小耗時(shí):1.0 ms單線程最大耗時(shí):254.0 ms
總結(jié):
優(yōu)點(diǎn)不依賴數(shù)據(jù)、靈活方便、性能優(yōu)于數(shù)據(jù)庫(kù)的、沒(méi)有單點(diǎn)故障(高可用)缺點(diǎn)需要占用網(wǎng)絡(luò)資源、性能要比本地生成慢、需要增加插件