分布式系統下登入會話控制系統設計

2021-08-28 13:12:56 字數 2764 閱讀 9326

背景介紹:

本人目前就職於中國電信旗下第三方支付公司--甜橙金融的資訊科技部客戶平台,該平台負載管理公司近2億使用者的個人資訊與鑑權憑證,並提供相關的介面能力。我主要負責該平台的需求分析與設計工作。

甜橙金融通過自主研發,經過一段時間的積累,目前主要業務已經執行在第三代基礎技術平台。該平台採用分布式架構,主要中介軟體選型包括dubbo,zookeeper,kafka,redis集群等。目前在公司每年一次百萬商戶參與的525營銷活動中,平台能很好的支撐爆點活動中海量使用者的高併發請求。

本文中分享的分布式系統下登入會話控制系統,在活動中支撐的日均介面呼叫量峰值已達4億餘次。

目錄一.會話是什麼?

二.分布式系統下的session的儲存問題以及解決思路。

負載均衡伺服器處理

session資料同步

資料庫集中儲存

三.分布式系統會話控制系統設計

四. 總結

解決問題,從最簡單的開始,首先讓我們了解一下什麼是會話。

使用者在使用我們的服務時,要使用乙個功能,往往在客戶端和我們的服務端中間需要進行多次的通訊和互動。這裡乙個使用者和服務端系統進行互動通訊的過程就叫做一次會話。而http協議本身是無狀態的,即服務端每次都會響應客戶端的請求,但是不會記得是哪乙個客戶端發起的請求。為了識別不同的請求是否來自同一客戶,引用http會話機制,即:多次http連線間維護使用者與同一使用者發出的不同請求之間關聯的情況稱為維護乙個會話(session)。

cookie和session,簡而言之cookie是儲存在客戶端中的資料,我們通過cookie來跟蹤與儲存使用者資料。session是將使用者的會話資料儲存在服務端。通過比對cookie和session中的資料來完成會話控制。詳細的cookie和session的區別和聯絡網上介紹的文章很多,這裡不再贅述。今天主要介紹一下分布式系統下的session的儲存問題。

解決這個儲存問題的思路一般可以有以下幾種。

如圖2所示。這是最簡單的方案,通過做標記,我們確保每乙個session的請求都一定能夠落到同乙個服務端上進行處理,session進行應用伺服器的本地化儲存非常方便,這種方案裡面,對單個使用者來說實際上伺服器還是一種單機模式,所以也帶來了幾個問題:

集群模式失效,單個使用者每次的請求只能由乙個伺服器進行處理,該伺服器宕機或者重啟,該機器上的所有會話資料丟失,和分布式集群的高可用初衷相違背。

負載均衡器變為了乙個有狀態的節點,要儲存會話和具體的伺服器的對映關係,記憶體消耗大,容災難度大

如圖3所示,這個方案主要做的就是在應用伺服器之間做session資料的同步。即每個應用伺服器都儲存了全部使用者的會話資料。好處是負載均衡器恢復了無狀態,不再儲存對映關係,使用者的請求也可以任意落到某一應用伺服器。這種方案也有它的侷限性:

同步session資料需要非常大的網路開銷,而且維護同步資料的邏輯也很複雜,牽一髮而動全身。

單機儲存會話資料記憶體占用過高。使用者量越大機器數量越多,每個機器需要儲存的資料就越多。且每台機器都是儲存的重複資料。

方案3也是在方案2思路上進行的優化,如圖4所示,我們將session資料儲存在資料庫中。

可以看到在資料庫集中儲存的方案中,負載均衡伺服器同樣是無狀態的節點,且使用者的請求也不用固定在某一特定的應用伺服器上。但是沒有了資料的同步和複製。我們通過集中儲存的方式,將session資料的增刪改查集中到了乙個地方。尤其是在如今使用者量大,伺服器多,併發高的場景中,session資料集中儲存的有點非常明顯。在儲存的資料庫選擇上,可以選擇關係型資料庫 如mysql,oracle等,也可以選用非關係型資料庫如redis,memcache等。

我們可以採用會話憑證分級的方式,密碼登入可以換取長期有效的會話憑證token, token可以換取短期有效的會話臨時憑證temptoken。會話憑證具體的儲存以及使用 方式如下表1:

表1 會話憑證儲存及使用方式表

憑證類別

獲取方式

有效期儲存位置

是否持久化

登入密碼

使用者設定 長期

關係型資料庫 是

token

校驗登入密碼 長期

關係型資料庫 是

temptoken

校驗token 短期

非關係型資料庫 否

架構設計如下圖5:

session和cookie,我相信是每個網際網路從業人員都會接觸到的乙個熟悉而又陌生的東西。分布式系統下登入會話的控制,上文主要介紹了基於會話憑證分級的系統設計以及功能設計的核心思路,拋磚引玉,要用在生產中,還需要在很多方面花功夫。

以安全方面為例,客戶端token和temptoken的加密加固儲存,客戶端和服務端通訊過程中,報文的加密以及數字信封的使用都是首先要解決的問題,不然很容易造成使用者資料洩漏。

系統架構方面,應用伺服器分布式架構的選擇,關係型資料庫中資料表索引的設計,非關係型資料庫的選型和key-value結構的設計都可能對這個簡單的會話控制功能的穩定和效能造成影響。

GIT分布式版本控制系統

git是乙個開源的分布式版本控制系統,用以有效 高速的處理從很小到非常大的專案版本管理。分布式相比於集中式的最大區別在於開發者可以提交到本地,每個開發者通過轉殖 git clone 在本地機器上拷貝乙個完整的git倉庫。專案使用git的一般情景 1 從伺服器上轉殖完整的git倉庫或者建立本地的git...

git分布式版本控制系統

1.git三個工作區 2.使用前配置3.git命令 本地 git init 建立版本庫 在當前資料夾下多出乙個.git檔案 git add 新增到暫存區 git commit m 版本說明 新增到歷史區 git log 檢視日誌 git reflog 檢視所有日誌 git diff 比較工作區和暫存...

GIT分布式版本控制系統

git是一款免費 開源的分布式版本控制系統,用於敏捷高效地處理任何或小或大的專案。1 git的讀音為 g t git是乙個開源的分布式版本控制系統,可以有效 高速的處理從很小到非常大的專案版本管理。2 git 是 linus torvalds 為了幫助管理 linux 核心開發而開發的乙個開放原始碼...