Scai,攜程高級(jí)研發(fā)經(jīng)理,多年深耕于賬號(hào)中臺(tái),持續(xù)推進(jìn)中臺(tái)的技術(shù)架構(gòu)演進(jìn)及性能優(yōu)化。
在互聯(lián)網(wǎng)早期時(shí)代,賬號(hào)系統(tǒng)的功能非常廣泛,包括賬號(hào)管理、登錄認(rèn)證相關(guān)能力以及維護(hù)各類用戶信息,比如頭像、昵稱、積分、等級(jí)等。隨著業(yè)務(wù)的發(fā)展,每個(gè)功能逐漸分化出自己的需求和架構(gòu)側(cè)重點(diǎn),獨(dú)立出各自的領(lǐng)域服務(wù)也成了業(yè)界共識(shí)。
本文分享的賬號(hào)系統(tǒng),指的是提供用戶賬號(hào)管理、登錄認(rèn)證相關(guān)能力的系統(tǒng)。介紹了攜程在不斷發(fā)展的過程中,賬號(hào)系統(tǒng)在領(lǐng)域化、中臺(tái)化和多Region化方向上的演進(jìn)、探索和一些思考。
微服務(wù)迅猛發(fā)展階段,賬號(hào)系統(tǒng)分裂出了很多應(yīng)用。比如,專門支持三方登錄的應(yīng)用,專門保存賬號(hào)實(shí)名信息的應(yīng)用,針對(duì)不同平臺(tái)的接入應(yīng)用。一開始確實(shí)可以滿足迅速開發(fā)上線的需求,當(dāng)應(yīng)用裂變到幾十個(gè)的時(shí)候,應(yīng)用分層不合理,領(lǐng)域邏輯不內(nèi)聚帶來的問題逐漸顯現(xiàn)出來:
1)用戶請(qǐng)求會(huì)經(jīng)歷多個(gè)應(yīng)用之間的RPC調(diào)用,性能和穩(wěn)定性受影響。
2)操作無法原子性,易出現(xiàn)臟數(shù)據(jù)。
3)應(yīng)用過多,開發(fā)、運(yùn)維、測(cè)試范圍大,影響效率。
領(lǐng)域化是對(duì)賬號(hào)系統(tǒng)的全面重構(gòu),有以下兩個(gè)目標(biāo):
1)合理劃分領(lǐng)域,邏輯內(nèi)聚。
2)改造需要對(duì)業(yè)務(wù)透明。
圖片
賬號(hào)系統(tǒng)功能主要分為3個(gè)類型:
1)核心功能:負(fù)責(zé)管理和維護(hù)賬號(hào)系統(tǒng)的核心功能和數(shù)據(jù)。由于涉及到用戶的核心數(shù)據(jù),相關(guān)插入、變更接口只可暴露給業(yè)務(wù)BFF層。
賬號(hào)領(lǐng)域:包括賬號(hào)信息查詢;賬號(hào)注冊(cè)/注銷;手機(jī)、郵箱、三方等數(shù)據(jù)的綁定/解綁;openid的生成;密碼的管理和認(rèn)證等功能。
登錄態(tài)領(lǐng)域:負(fù)責(zé)登錄態(tài)生成、驗(yàn)證、續(xù)期、踢出、過期刪除等功能。
日志監(jiān)控領(lǐng)域:負(fù)責(zé)記錄賬號(hào)相關(guān)業(yè)務(wù)埋點(diǎn)和日志。
2)輔助功能:不僅可以被賬號(hào)相關(guān)業(yè)務(wù)依賴,也可以開放出去供類似業(yè)務(wù)場(chǎng)景的接入。
Token(臨時(shí)憑證)領(lǐng)域:負(fù)責(zé)Token的生成、驗(yàn)證、過期刪除等功能。
驗(yàn)證碼領(lǐng)域:負(fù)責(zé)驗(yàn)證碼生成、發(fā)送、驗(yàn)證等功能。
3)接入功能:負(fù)責(zé)賬號(hào)相關(guān)的業(yè)務(wù)功能接入,包括端上接入和內(nèi)網(wǎng)服務(wù)接入。
BFF層:主要負(fù)責(zé)各類業(yè)務(wù)邏輯的組合(注冊(cè)、登錄、改綁手機(jī)等)以及接入方權(quán)限的控制。
前端UI、SDK:前端顯示UI以及提供出去供業(yè)務(wù)接入的SDK。直接對(duì)接BFF層。
其他一些業(yè)務(wù)中必須依賴的模塊,如風(fēng)控模塊,依賴公司相應(yīng)團(tuán)隊(duì)提供的能力即可。
賬號(hào)系統(tǒng)非常核心,上游是公司的各類業(yè)務(wù),依賴方非常多,牽一發(fā)而動(dòng)全身。同時(shí),業(yè)務(wù)也在急速發(fā)展,不會(huì)停下來等待系統(tǒng)的改造。對(duì)賬號(hào)系統(tǒng)的改造無疑是在快速開動(dòng)的汽車上更換輪胎。因此,對(duì)賬號(hào)系統(tǒng)的改造需要一套完整的比對(duì)流程,需要滿足兩個(gè)條件:
1)完整性。比對(duì)需要覆蓋100%的場(chǎng)景,避免場(chǎng)景遺漏。
2)隔離性。比對(duì)需要在離線集群和存儲(chǔ)上進(jìn)行,避免對(duì)在線系統(tǒng)造成影響。同時(shí),需要屏蔽掉離線集群不必要的對(duì)外請(qǐng)求,以免對(duì)下游造成影響(包括RPC調(diào)用,消息,監(jiān)控?cái)?shù)據(jù)等)。
在此基礎(chǔ)上,完成了賬號(hào)系統(tǒng)的讀寫比對(duì)流程:
讀對(duì)比:轉(zhuǎn)發(fā)-比對(duì)。利用鏡像流量的能力,將鏡像流量導(dǎo)入離線Old代碼集群。Old代碼集群在處理流量的同時(shí),會(huì)轉(zhuǎn)發(fā)到離線New代碼集群,完成接口返回?cái)?shù)據(jù)比對(duì)。
圖片
寫比對(duì):錄制-回放-比對(duì)。提前錄制生產(chǎn)環(huán)境的流量,記錄輸入、輸出和發(fā)出的消息等數(shù)據(jù);分別部署New/Old代碼離線集群和兩套相同的離線DB(里面數(shù)據(jù)為同一時(shí)間點(diǎn)的Snapshot);將錄制好的流量(DB Snapshot時(shí)間點(diǎn)后)回放到兩套集群上,比對(duì)輸出、存儲(chǔ)、發(fā)出來的消息等數(shù)據(jù),確保New/Old集群和錄制的結(jié)果三方一致。
圖片
完成了領(lǐng)域化改造后,核心數(shù)據(jù)的變更沉淀到對(duì)應(yīng)的領(lǐng)域服務(wù)中,相關(guān)操作可以滿足原子性,避免臟數(shù)據(jù)的產(chǎn)生;應(yīng)用減少以及引入BFF層,減少了應(yīng)用間,用戶端和服務(wù)端的交互次數(shù),提升了系統(tǒng)穩(wěn)定性,提升了開發(fā)、運(yùn)維、測(cè)試的效率。
和大部分互聯(lián)網(wǎng)公司一樣,隨著集團(tuán)的發(fā)展,會(huì)出現(xiàn)不同的品牌,需要一套獨(dú)立的賬號(hào)體系。也有業(yè)務(wù)團(tuán)隊(duì)會(huì)將自己研發(fā)的賬號(hào)系統(tǒng)交給賬號(hào)團(tuán)隊(duì)統(tǒng)一管理。如果賬號(hào)系統(tǒng)沒有做好中臺(tái)化的準(zhǔn)備,勢(shì)必會(huì)在接入的過程中手忙腳亂。不僅代碼中會(huì)存在大量的判斷邏輯,接入時(shí)間也會(huì)很長(zhǎng),甚至可能無法滿足業(yè)務(wù)的需求。中臺(tái)化的改造需要考慮以下三點(diǎn):
1)降低改造復(fù)雜度
減少系統(tǒng)的架構(gòu)改造復(fù)雜度
降低業(yè)務(wù)接入的復(fù)雜度
2)配置化
將需求抽象為功能,減少對(duì)業(yè)務(wù)需求的定制化開發(fā)
簡(jiǎn)單配置即可快速接入
3)提供多樣化的接入方式,以滿足不同業(yè)務(wù)方的接入需求
中臺(tái)化改造過程中,賬號(hào)體系ID是最核心的概念。
因此,對(duì)于賬號(hào)相關(guān)查詢請(qǐng)求,如果不知道賬號(hào)所在的體系ID,就無法找到對(duì)應(yīng)的存儲(chǔ)。要么進(jìn)行全存儲(chǔ)查詢,要么需要一個(gè)大表存儲(chǔ)UID到體系ID的映射關(guān)系,這會(huì)引入額外的依賴,提高成本的同時(shí),也會(huì)使得系統(tǒng)變得復(fù)雜。
另外,要求所有上游新增一個(gè)參數(shù)需花費(fèi)大量的資源推動(dòng)。
圖片
UID全局唯一,并且通過編碼區(qū)分不同的體系ID,可以大大降低改造和接入的復(fù)雜度。
新接入的賬號(hào)體系,通過UID的編碼可以快速判斷賬號(hào)體系ID。
對(duì)于存量UID,默認(rèn)屬于最早的賬號(hào)體系。
同時(shí),UID全局唯一也可以提高排障和TS時(shí)的效率(不用反復(fù)確認(rèn)某一個(gè)UID屬于哪個(gè)賬號(hào)體系)。
當(dāng)然,一些不通過UID進(jìn)行的查詢接口,如通過手機(jī)號(hào)查詢賬號(hào)的場(chǎng)景,還是需要業(yè)務(wù)方傳遞體系ID,但通過這樣的設(shè)計(jì)已極大的縮小了需要改造的范圍。
賬號(hào)中臺(tái)化后主要提供以下能力:
1)賬號(hào)管理:管理賬號(hào)的完整生命周期,包括注冊(cè),驗(yàn)證,注銷。支持賬號(hào)綁定手機(jī)號(hào),郵箱,第三方賬號(hào),以及對(duì)應(yīng)屬性的變更、解綁操作。管理賬號(hào)密碼,支持多種加密邏輯。管理Oauth相關(guān)數(shù)據(jù)。
2)多樣化登錄方式:包括賬號(hào)密碼登錄,手機(jī)驗(yàn)證碼登錄,手機(jī)一鍵登錄,掃碼登錄,社交賬號(hào)登錄等登錄方式。特別的,在社交賬號(hào)登錄方式中,賬號(hào)系統(tǒng)已完成了與多個(gè)平臺(tái)的對(duì)接,常見的比如微信、支付寶、QQ、微博、華為等。
3)登錄態(tài)管理:包括登錄態(tài)的生成、驗(yàn)證,登錄態(tài)信息維護(hù),按需續(xù)期、踢出等功能。
4)安全&監(jiān)控體系:賬號(hào)中臺(tái)具有完善的日志體系,并已完成對(duì)接前端滑塊和后端實(shí)時(shí)風(fēng)控。
在中臺(tái)化建設(shè)的過程中,雖然已經(jīng)全量梳理了中臺(tái)應(yīng)該提供的能力,仍然會(huì)有新的需求需要支持。在接到新的需求,而現(xiàn)有的功能無法支持的時(shí)候,不要急于解決本次需求,需要思考本次需求涉及的具體功能,從而在實(shí)現(xiàn)的過程中避免定制化邏輯,沉淀為中臺(tái)的新能力。
比如,某次需求為:一個(gè)賬號(hào)體系全平臺(tái)需要保證登錄態(tài)是唯一的,即新的登錄產(chǎn)生后,會(huì)踢出之前的登錄態(tài)。可以抽象為需要中臺(tái)提供對(duì)某一個(gè)賬號(hào)體系的登錄態(tài)數(shù)量進(jìn)行控制。進(jìn)一步的,可以按照平臺(tái)(App、小程序、H5等)分別進(jìn)行控制。
圖片
中臺(tái)化建設(shè)完成后,不同的功能都可以通過配置進(jìn)行控制,也可以對(duì)每一個(gè)功能進(jìn)行細(xì)節(jié)上的調(diào)整。同一體系的配置放置在同一配置文件中,便于維護(hù)。如果沒有特別的需求,直接使用默認(rèn)配置接入即可。
圖片
為了適應(yīng)業(yè)務(wù)多樣化的接入需求,中臺(tái)提供了3種接入方式:
1)UI接入:在攜程的主Web站點(diǎn)、App和小程序,統(tǒng)一使用中臺(tái)開發(fā)的前端界面,業(yè)務(wù)方按需拉起。
2)前端SDK接入:有少量定制需求,如顯示的LOGO需要調(diào)整,協(xié)議需要變更等,可以使用中臺(tái)的前端SDK接入。此SDK已包含所有的流程邏輯,接入時(shí)僅需替換掉對(duì)應(yīng)的元素。
3)后端對(duì)接:若業(yè)務(wù)方有過多的與業(yè)務(wù)藕合的邏輯,則不適合將邏輯放在中臺(tái)。此時(shí),業(yè)務(wù)方可以自行開發(fā)一層BFF,利用中臺(tái)BFF層和輔助系統(tǒng)(驗(yàn)證碼、Token)提供的能力,組合出合適的業(yè)務(wù)邏輯。
中臺(tái)化改造完成后,新賬號(hào)體系需要申請(qǐng)接入時(shí),僅需選擇需要的能力,中臺(tái)通過調(diào)整配置,小時(shí)級(jí)即可完成接入。大大減少了新增一套賬號(hào)體系的支持成本。
兩地三中心是近期比較熱門的部署方案,一方面可以更好的應(yīng)對(duì)城市級(jí)別的故障,另一方面可以更好的服務(wù)當(dāng)?shù)赜脩簦ɡ纾粋€(gè)產(chǎn)品定位于服務(wù)西部用戶,相應(yīng)的應(yīng)用和數(shù)據(jù)部署在西部城市可以提供更好的用戶體驗(yàn))。賬號(hào)作為業(yè)務(wù)的基石,需要第一時(shí)間完成多Region部署,為各業(yè)務(wù)的部署做好準(zhǔn)備。
多Region部署,賬號(hào)中臺(tái)制定了兩個(gè)目標(biāo):
1)數(shù)據(jù)支持多Region部署,請(qǐng)求正確路由。結(jié)合業(yè)務(wù)需求,賬號(hào)中臺(tái)的應(yīng)用和數(shù)據(jù)按需部署到指定的Region中,相應(yīng)的用戶請(qǐng)求需要準(zhǔn)確的落到對(duì)應(yīng)的Region。
2)架構(gòu)需要同構(gòu)部署,不能因?yàn)槎郣egion部署引入開發(fā)和維護(hù)上的額外成本。
為了滿足數(shù)據(jù)不同Region部署的需求,需要對(duì)用戶數(shù)據(jù)進(jìn)行識(shí)別并打標(biāo),利用公司DB數(shù)據(jù)同步組件(DRC)進(jìn)行帶過濾的雙向同步(有的數(shù)據(jù)僅需要本Region使用,會(huì)過濾不進(jìn)行同步),將數(shù)據(jù)部署到需要的Region上。后續(xù)的更新也由DRC進(jìn)行同步。
圖片
在數(shù)據(jù)部署完成后,如何保證用戶的請(qǐng)求落到了正確的Region。
方案一:每次請(qǐng)求經(jīng)過網(wǎng)關(guān)的時(shí)候,網(wǎng)關(guān)進(jìn)行一次用戶到Region的映射查詢,再將請(qǐng)求正確的路由到數(shù)據(jù)所在Region。這樣的做法不僅會(huì)對(duì)請(qǐng)求引入一次額外的查詢,還會(huì)使得網(wǎng)關(guān)這一及其關(guān)鍵的節(jié)點(diǎn)引入一個(gè)依賴,會(huì)影響整個(gè)網(wǎng)站的穩(wěn)定性。
方案二:基于用戶的數(shù)據(jù)一定完整的存在某一個(gè)Region的前提,在用戶登錄的時(shí)候,將之前識(shí)別時(shí)打上的標(biāo)識(shí)下發(fā)到端上。請(qǐng)求的時(shí)候,網(wǎng)關(guān)只需對(duì)標(biāo)識(shí)進(jìn)行簡(jiǎn)單的路由配置,即可正確的路由到對(duì)應(yīng)的Region。
圖片
在多Region的部署中,賬號(hào)中臺(tái)實(shí)現(xiàn)了同構(gòu)部署。
1)網(wǎng)關(guān)層。利用網(wǎng)關(guān)根據(jù)用戶登錄下發(fā)的標(biāo)識(shí),將請(qǐng)求路由到正確的Region。
2)內(nèi)網(wǎng)服務(wù)。通過完整的部署,內(nèi)網(wǎng)請(qǐng)求在同一Region內(nèi)完成,實(shí)現(xiàn)Region閉環(huán),提高服務(wù)性能。同時(shí)也避免了DB多Region寫入引起數(shù)據(jù)沖突的問題。
3)數(shù)據(jù)層。
DB數(shù)據(jù)。DB表結(jié)構(gòu)完全一致,通過DRC根據(jù)用戶標(biāo)識(shí)進(jìn)行帶過濾的多向復(fù)制。
Redis緩存數(shù)據(jù)。本地使用,不需要同步。當(dāng)一個(gè)Region的數(shù)據(jù)有變更的時(shí)候,其他Region接受DRC的同步消息,對(duì)本Region的Redis進(jìn)行刪除。
圖片
在這樣的多Region部署架構(gòu)下,可以根據(jù)業(yè)務(wù)的使用場(chǎng)景和數(shù)據(jù)部署需求,實(shí)現(xiàn)用戶數(shù)據(jù)的單Region或多Region存儲(chǔ)。
賬號(hào)系統(tǒng)從最開始的巨大單體應(yīng)用中剝離出來,經(jīng)歷了若干年的演進(jìn),變成了現(xiàn)在支持多Region部署的賬號(hào)中臺(tái),這是業(yè)務(wù)發(fā)展和互聯(lián)網(wǎng)技術(shù)進(jìn)步的一種體現(xiàn)和必然趨勢(shì)。
當(dāng)然,這種趨勢(shì)也不會(huì)停止于此,賬號(hào)系統(tǒng)的功能和架構(gòu)必將繼續(xù)演進(jìn),其他系統(tǒng)也同樣如此。回望過去,基于現(xiàn)在,展望未來,敢為人先,為各業(yè)務(wù)的發(fā)展打好基石,這正是賬號(hào)等基礎(chǔ)系統(tǒng)的意義所在,技術(shù)團(tuán)隊(duì)的價(jià)值也存在于此。
本文鏈接:http://www.www897cc.com/showinfo-26-90504-0.html領(lǐng)域化、中臺(tái)化和多Region化,攜程賬號(hào)系統(tǒng)演進(jìn)之路
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com