1. 程式人生 > >Session 在分布式系統中實現方式

Session 在分布式系統中實現方式

同步問題 data- 操作 add cti ddc 技術 article sql數據庫

##server獨立Session
例如以下圖所看到的:
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會通知用戶又一次登錄。這樣用戶體驗肯定會受到影響。並且非常可能用造成用戶的數據丟失。

每臺server保留所有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

server共享Session信息:

技術分享

長處

每一個用戶的Session信息都會被存儲到應用之外的另外一臺server(可能是數據庫,也可能是KV存儲服務),這樣應用server就不用存儲每一個用戶的Session信息了,節約了非常大的內存開銷。

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

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

缺點

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

在Cookie中傳遞Session數據

在Cookie中存放用戶信息倒是能排除一個不穩定的因素,可是Cookie在安全方面還是存在隱患。並且Cookie也有長度的限制。

在站點中用到最多的可能就是 應用獨享Session 和 集中管理Session的方式。


當中集中管理Session中能夠用memcached 做為sessionserver。效率也非常高。當然其它的NoSQL數據庫也能夠。
大家假設有什麽好的建議能夠一起學習。

Session 在分布式系統中實現方式