分散式系統Session 實現方式

AskHarries發表於2018-05-14

Session Sticky 方式管理

例如以下圖所看到的:
server獨立Session要求使用者的每次請求都必須在同一臺應用server上面操作,這就要求負載均衡server每次都能把使用者的請求傳送到同一個地址的server上面。
第一個使用者第一次訪問的1號server。那個在使用者的整個會話中都必須由負載均衡server導流到1號server上面。

其它server不會儲存1號使用者的Session資訊。

如今的負載均衡server一般都有這個功能(nginx)

可是假設出現以下的情況

這個時候1號server當機的情況下,負載均衡server會把1號使用者導流到2號或者3號server上面,可是使用者在2和3號server上面沒有安全的上下文環境。server會通知使用者又一次登入。這樣使用者體驗肯定會受到影響。並且非常可能用造成使用者的資料丟失。

Session Replication 方式管理 (即session複製)

每臺server保留所實使用者的Session這就關係到應用server之間的Session同步問題。實時性要求比較高。

這樣的方式能夠避免上面server獨立Session所遇到的問題,例如以下圖所看到的:

長處

這樣的方式即使出現第一種情況那麼2和3號server上面也儲存的1號的Session資訊,當出現故障負載均衡server把1號使用者導流到2和3號server上面時。server也會發現有1號使用者的安全上下文,能夠繼續訪問並且不須要又一次登入。

缺點

可是這樣的方式也有缺點,那就是相應用server的Session同步實時性要求比較高,並且會帶來額外的跨帶開銷。並且當Session之遙有變化時,就須要同步。假設Session裡面的資訊量比較大。那個會佔用相當大的記憶體消耗。

快取集中式管理

server共享Session資訊:

長處

每一個使用者的Session資訊都會被儲存到應用之外的另外一臺server(可能是資料庫,也可能是KV儲存服務),這樣應用server就不用儲存每一個使用者的Session資訊了,節約了非常大的記憶體開銷。

當不同應用server須要用到Session資訊的時候就去找共享Sessionserver來獲取資訊。

這樣負載均衡server也就不用把使用者固定的分配到一臺server上面了,並且也不用server之間來複制Session資訊,當Session資訊發生改變時,應用server都去共享server改動資訊就可以。

缺點

比較依賴於共享server,一旦共享server或者共享server叢集出現故障。使用者會收到非常大影響

分散式系統Session 實現方式


相關文章