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