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