使用者中心,顧名思義就是管理使用者的地方,幾乎是所有互聯網公司最為核心的子系統之一。 它的核心功能是登錄與註冊,主要功能是修改密碼、換綁手機號碼、獲取使用者資訊、修改使用者資訊和一些延伸服務,同時還有登錄之後生成Token以及校驗Token的功能。 下面我們從幾個維度來拆解使用者中心美國GOOGMAN GOOGMAN增大丸官網 goodman增大丸評價 增大丸 增大丸推薦
使用者中心既需要為使用者提供服務,也會承擔其他業務的頻繁調用;既然需要為使用者提供服務,它就會自帶一些業務邏輯,比如使用者在登錄過程中需要風控或簡訊的校驗,那麼就會存在不可用的風險。 而比如獲取使用者資訊的介面,則沒有那麼多的依賴,可能只需要調用資料庫或者緩存就可以。 獲取使用者資訊介面要求穩定,而核心的登錄註冊介面也需要穩定,但是當我們在介面層面加一些策略或者修改的時候,不希望因為上線問題導致整個服務不可用,而且上線后,需要對整個服務功能做全量的回歸,導致資源嚴重浪費。
因此,基於業務特性,我們可以將使用者中心拆成3個獨立的微服務: 網關服務,核心服務,異步消費者服務。 網關服務,提供HTTP服務,聚合了各種業務邏輯和服務調用,比如登錄時候需要校驗的風控或者簡訊;核心服務,處理簡單的業務邏輯以及數據存儲,核心服務處在調用鏈路的終端,幾乎不依賴調用其他服務,比如校驗Token或者獲取使用者資訊,他們就只依賴於redis或者資料庫;而異步消費者服務,則處理並消費異步消息。 下文會詳細介紹。
這樣的設計之後,當有新功能上線時,核心服務和異步消費服務幾乎不需要重新發佈,只需要發佈網關服務,依賴我們核心服務的第三方非常放心,層級也非常的清晰。 當然,這樣做的代價就是服務的調用鏈路變長了。 由於涉及到閘道和核心服務,就需要發佈兩個服務,而且要做相容性測試
使用者中心的介面涉及到使用者的核心資訊,安全性要求高;同時,承接了較多第三方的調用,可用性要求也高。 因此,對使用者中心的介面做以下設計:
首先,介面可以拆分為面向Web和面向App的介面。 Web介面需要做到跨域情況下的單點登錄,加密、驗簽和token校驗的方式也同App端的不一樣。
其次,對核心介面做特殊處理。 比如登錄介面,在邏輯和鏈路上做了一些優化。 為什麼要對這些介面做特殊處理呢? 假如使用者不能登錄,使用者會非常恐慌,客訴量會立馬上來。
那怎麼做呢? 一方面,我們將使用者核心資訊表做簡單。 使用者的信息當中會包含userId、手機號碼、密碼、頭像、昵稱等字段,假如把使用者的這些所有資訊都保存在一張表中,那麼這張表將會異常龐大,變更欄位變得異常困難。 因此,需要將使用者表拆分,將核心的資訊保存在使用者表中,比如userId、username、手機號碼、密碼、鹽值(隨機生成)等;而一些如性別,頭像,昵稱等資訊保存在用戶資料表中。
另一方面,我們需要將登錄的核心鏈路做短,短到只依賴於讀庫。 一般情況下,用戶登錄后,需要記錄使用者登錄資訊,調用風控或者簡訊等服務。 對於登錄鏈路來說,任何一個環節出現問題都有可能導致使用者無法登錄,那麼怎麼樣才能做到最短的鏈路呢? 方法就是依賴的服務可自動降級。 比如說反欺詐校驗出問題了,那麼它自動降級后使用它的預設策略,極端情況下只做密碼校驗,主庫掛了之後還能到從庫讀取用戶資訊。
最後就是介面的安全性校驗。 對App介面我們需要做防重放和驗簽。 驗簽可能大家比較熟悉,但是對防重放這個概念可能相對陌生。 防重放,顧名思義就是防止請求重複發送。 使用者請求在特定時間段內只能請求一次。 即使使用者請求被攻擊者挾持,在一段時間內也無法重複請求。 如果攻擊者想要篡改使用者請求再發送,對不起,請求不會通過。 得益於大數據的支持,結合終端,我們還可以把每個用戶行為畫像存儲在系統中(或者調用第三方服務)。 用戶發起請求后,我們的介面會根據用戶畫像對用戶進行諸如手機號碼校驗、實名認證、人臉或者活體校驗。
隨著使用者的增長,數據超過了1億,怎麼辦? 常見的辦法就是分庫分表。 我們來分析一下使用者中心常見的一些表結構:使用者資訊表,第三方登錄關聯表,使用者事件表。 從上述表中可以看出來,使用者相關的數據表增長相對緩慢,因為用戶增長是有天花板的。 使用者事件表的增長是呈指數級增長,因為每個使用者登錄、變更等密碼及變更手機號碼等操作是不限次數。
因此,首先我們可以先把使用者資訊表垂直切分。 正如上面說的,將使用者ID、密碼、手機號、鹽值等常見欄位從使用者資訊表中拆分,其他使用者相關的資訊用單獨一張表。 另外,把使用者事件表遷移至其他庫中。 相比於水準切分,垂直切分的代價相對較少,操作起來相對簡單。 使用者核心資訊表由於數據量相對較少,即使是億級別的數據,利用資料庫緩存的機制,也能夠解決性能問題。
其次,我們可以利用前後台業務的特性採用不同的方式來區別對待。 對於用戶側前台訪問:用戶通過username/mobile登錄或者通過uid來查詢用戶資訊。 用戶側資訊的訪問通常是單條數據的查詢,我們可以通過索引多次查詢來解決一致性和高可用問題。 對於運營側後台訪問:根據年齡、性別、登錄時間段、註冊時間段等來進行查詢,基本上都是批量分頁查詢。 但是由於是內部系統,查詢量低,對一致性要求低。 如果使用者側和運營側的查詢採用同一個資料庫,那麼運營側的排序查詢會導致整個庫的CPU上升,查詢效率下降,影響到用戶側。 因此,運營側使用的資料庫可以是和使用者側同樣的MySQL離線庫,如果想要增加運營側的查詢效率,可以採用ES非關係型資料庫。 ES支援分片與複製,方便水準分割和擴展,複製保證了ES的高可用與高吞吐,同時能夠滿足運營側的查詢需求。
最後,如果還是要水準切分來保證系統的性能,那麼我們採取什麼樣的切分方式呢? 常見的方法有索引表法和基因法。 索引表法的思路主要是UID能夠直接定位到庫,但是手機號碼或者username是無法直接定位到庫的,需要建立一個索引表來記錄mobile與UID或者username與UID的映射關係的方式來解決這個問題。 通常這類數據比較少,可以不用分庫分表,但是相比直接查詢,多了一次資料庫查詢的同時,在新增數據的時候還多了一次映射關係的插入,事務變大。 基因法的思路是我們將username或者mobile融入到UID中。 具體做法如下:
-
用戶註冊時,根據用戶的手機號碼,利用函數生成N bit的基因mobile_gen,使得mobile_gen=f(mobile);
-
生成M bit全域唯一的id,作為用戶標識;
-
拼接M和N,作為UID賦給使用者;
-
根據N bit來取餘來插入到特定資料庫;
-
查找使用者數據的時候,將使用者UID的後N bit取餘來落到最終的庫中。
從上述過程中看,基因法只適用於某類經常查詢的場景,比如用手機號碼登錄,如果使用者使用username登錄就比較麻煩了。 因此大家也可以根據自己的業務場景來選擇不同的方式水平切
用戶登錄之後,另一個重要的事情就是Token的生成與校驗。 使用者的Token分為兩類, 一類是web端登陸生成的Token, 這個Token可以和Cookie結合, 達到單點登陸的效果,在此不細說了。 另外一類就是APP端登錄生成的Token。 使用者在我們的APP輸入使用者名密碼之後,服務端會對使用者的使用者名密碼進行校驗,成功之後從系統配置中心獲取加密演算法的版本以及秘鑰,並按照一定的格式排列使用者ID,手機號、隨機碼以及過期時間,經過一系列的加密之後,生成了Token之後並將其存入Redis緩存。 而Token的校驗就是把使用者ID和Token組合並校驗是否在Redis中存在。 那麼假如Redis不可用了怎麼辦呢? 這裡有一個高可用和自動降級的設計。 當Redis不可用的時候, 服務端會生成一個特殊格式的Token。 當校驗Token的時候,會對Token的格式進行一個判斷。
假如判斷為Redis不可用時生成的Token,那麼服務端會對Token進行解密,而Token的生成是由使用者ID,手機號、隨機碼和過期時間等數據按照特定順序排列並加密而來的, 那麼解密出來的數據中也包含了ID,手機號碼,隨機碼和過期時間。 服務端會根據獲取到的數據查詢資料庫, 比對之後告訴使用者是否登錄成功。 由於記憶體緩存redis和資料庫緩存性能的差距,在redis不可用的情況下,降級有可能會導致資料庫無法及時回應,因此需要在降級的方法上加入限流增大丸推薦 增大丸效果 增大丸ptt goodman增大丸怎麼吃增長增粗
數據安全對使用者中心來說非常重要。 敏感數據需要脫敏處理,對密碼更是要做多重的加密處理。 應用雖然有自己的安全策略,但如果把駭客限制在登錄之前,那應用的安全性將得到大幅度的提升。 互聯網上使用者明文數據遭到洩露的案件屢屢發生,因此各大企業對數據安全的認識也提到了前所未有的高度。 而即使使用了MD5和salt的加密方式,依然可以使用彩虹表的方式來破解。 那麼使用者中心對使用者資訊是怎麼保存的呢?
文章定位: