架構(gòu)師技術(shù)聯(lián)盟的業(yè)務(wù)多活架構(gòu)和分布式CAP實(shí)戰(zhàn),單元化架構(gòu)實(shí)踐的學(xué)習(xí)筆記
我們不僅僅從淘寶買東西唬滑,把錢放到支付寶中其屏,也要從他們能給全國乃至世界十幾億人提供購物平臺和支付平臺的技術(shù)架構(gòu)中學(xué)到一些皮毛亚铁。
螞蟻支付寶是國內(nèi)最大的支付工具棚愤,其在雙 11 等活動日當(dāng)日的支付 TPS 可達(dá)幾十萬級骏庸,未來這個數(shù)字可能會更大髓涯,這決定了螞蟻單元化架構(gòu)從容量要求上看必然從單機(jī)房走向多機(jī)房袒啼。
支付寶將單元分成了三類(CRG 架構(gòu)):
1) RZone(Region Zone):所有可以分庫分表的業(yè)務(wù)系統(tǒng)整體部署的最小單元。每個 RZone 連上數(shù)據(jù)庫就可以撐起一片天空纬纪,把業(yè)務(wù)跑的溜溜的蚓再。
2) GZone(Global Zone):全局單元,意味著全局只有一份包各。部署了不可拆分的數(shù)據(jù)和服務(wù)摘仅,比如系統(tǒng)配置等。實(shí)際情況下问畅,GZone 異地也會部署娃属,不過僅是用于災(zāi)備,同一時刻护姆,同一時刻矾端,只有一地 GZone 進(jìn)行全局服務(wù)。GZone 一般被 RZone 依賴卵皂,提供的大部分是讀取服務(wù)秩铆。
3) CZone(City Zone):以城市為單位部署的單元。同樣部署了不可拆分的數(shù)據(jù)和服務(wù)灯变,比如用戶賬號服務(wù)豺旬,客戶信息服務(wù)等。理論上 CZone 會被 RZone 以比訪問 GZone 高很多的頻率進(jìn)行訪問柒凉。CZone 是基于特定的 GZone 場景進(jìn)行優(yōu)化的一種單元族阅,它把 GZone 中有些有著”寫讀時間差現(xiàn)象”的數(shù)據(jù)和服務(wù)進(jìn)行了的單獨(dú)部署,這樣 RZone 只需要訪問本地的 CZone 即可膝捞,而不是訪問異地的 GZone坦刀。
"寫讀時間差現(xiàn)象”是螞蟻架構(gòu)師們根據(jù)實(shí)踐統(tǒng)計(jì)總結(jié)的,他們發(fā)現(xiàn)大部分情況下蔬咬,一個數(shù)據(jù)被寫入后鲤遥,都會過足夠長的時間后才會被訪問。
生活中這種例子很常見林艘,我們辦完銀行卡后可能很久才會存第一筆錢盖奈;我們創(chuàng)建微博賬號后,可能想半天才會發(fā)微博狐援;我們下載創(chuàng)建淘寶賬號后钢坦,可能得瀏覽好幾分鐘才會下單買東西究孕。
當(dāng)然了這些例子中的時間差遠(yuǎn)遠(yuǎn)超過了系統(tǒng)同步時間。一般來說異地的延時在100ms以內(nèi)爹凹,所以只要滿足某地CZone寫入數(shù)據(jù)后100ms以后才用這個數(shù)據(jù)厨诸,這樣的數(shù)據(jù)和服務(wù)就適合放到 CZone 中。
相信大家看到這都會問:為啥分這三種單元禾酱?其實(shí)其背后對應(yīng)的是不同性質(zhì)的數(shù)據(jù)微酬,而服務(wù)不過是對數(shù)據(jù)的操作集。
下面我們來根據(jù)數(shù)據(jù)性質(zhì)的不同來解釋支付寶的 CRG 架構(gòu)颤陶。當(dāng)下幾乎所有互聯(lián)網(wǎng)公司的分庫分表規(guī)則都是根據(jù)用戶ID來制定的颗管。
而圍繞用戶來看整個系統(tǒng)的數(shù)據(jù)可以分為以下兩類:
1) 用戶流水型數(shù)據(jù):典型的有用戶的訂單、用戶發(fā)的評論滓走、用戶的行為記錄等垦江。這些數(shù)據(jù)都是用戶行為產(chǎn)生的流水型數(shù)據(jù),具備天然的用戶隔離性闲坎,比如A用戶的App上絕對看不到 B 用戶的訂單列表疫粥。所以此類數(shù)據(jù)非常適合分庫分表后獨(dú)立部署服務(wù)。
2) 用戶間共享型數(shù)據(jù):這種類型的數(shù)據(jù)又分兩類腰懂。一類共享型數(shù)據(jù)是像賬號梗逮、個人博客等可能會被所有用戶請求訪問的用戶數(shù)據(jù)。比如 A 向 B 轉(zhuǎn)賬绣溜,A 給 B 發(fā)消息慷彤,這時候需要確認(rèn) B 賬號是否存在;又比如 A 想看 B 的個人博客之類的怖喻。
另外一類是用戶無關(guān)型數(shù)據(jù)底哗,像商品、系統(tǒng)配置(匯率锚沸、優(yōu)惠政策)跋选、財(cái)務(wù)統(tǒng)計(jì)等這些非用戶緯度的數(shù)據(jù),很難說跟具體的某一類用戶掛鉤哗蜈,可能涉及到所有用戶前标。比如商品,假設(shè)按商品所在地來存放商品數(shù)據(jù)(這需要雙維度分庫分表)距潘,那么上海的用戶仍然需要訪問杭州的商品炼列。
這就又構(gòu)成跨地跨 Zone 訪問了,還是達(dá)不到單元化的理想狀態(tài)音比,而且雙維度分庫分表會給整個 LDC 運(yùn)維帶來復(fù)雜度提升俭尖。
直觀的類比,我們可以很輕易的將上述兩類數(shù)據(jù)對應(yīng)的服務(wù)劃分為 RZone 和 GZone,RZone 包含的就是分庫分表后負(fù)責(zé)固定客戶群體的服務(wù)稽犁,GZone 則包含了用戶間共享的公共數(shù)據(jù)對應(yīng)的服務(wù)焰望。
GZone 之所以只能單地部署,是因?yàn)槠鋽?shù)據(jù)要求被所有用戶共享缭付,無法分庫分表柿估,而多地部署會帶來由異地延時引起的不一致循未。
比如實(shí)時風(fēng)控系統(tǒng)陷猫,如果多地部署,某個 RZone 直接讀取本地的話的妖,很容易讀取到舊的風(fēng)控狀態(tài)绣檬,這是很危險的。
這時螞蟻架構(gòu)師們問了自己一個問題——難道所有數(shù)據(jù)受不了延時么嫂粟?這個問題像是打開了新世界的大門娇未,通過對 RZone 已有業(yè)務(wù)的分析,架構(gòu)師們發(fā)現(xiàn) 80% 甚至更高的場景下星虹,數(shù)據(jù)更新后都不要求立馬被讀取到零抬。
也就是上文提到的”寫讀時間差現(xiàn)象”,那么這就好辦了宽涌,對于這類數(shù)據(jù)平夜,我們允許每個地區(qū)的 RZone 服務(wù)直接訪問本地,為了給這些 RZone 提供這些數(shù)據(jù)的本地訪問能力卸亮,螞蟻架構(gòu)師設(shè)計(jì)出了 CZone忽妒。
在 CZone 的場景下,寫請求一般從 GZone 寫入公共數(shù)據(jù)所在庫兼贸,然后同步到整個 OB 集群段直,然后由 CZone 提供讀取服務(wù)。比如支付寶的會員服務(wù)就是如此溶诞。