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

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

其它server不會保存1號用戶的Session信息。數據庫

現在的負載均衡server通常都有這個功能(nginx)
安全

但是假設出現如下的狀況
markdown

這個時候1號server宕機的狀況下,負載均衡server會把1號用戶導流到2號或者3號server上面,但是用戶在2和3號server上面沒有安全的上下文環境。server會通知用戶又一次登陸。這樣用戶體驗確定會受到影響。而且很是可能用形成用戶的數據丟失。cookie

每臺server保留全部Session

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

這樣的方式可以避免上面server獨立Session所遇到的問題,例如如下圖所看到的:負載均衡

長處

這樣的方式即便出現第一種狀況那麼2和3號server上面也保存的1號的Session信息,當出現故障負載均衡server把1號用戶導流到2和3號server上面時。server也會發現有1號用戶的安全上下文,可以繼續訪問而且不需要又一次登陸。memcached

缺點

但是這樣的方式也有缺點,那就是相應用server的Session同步實時性要求比較高,而且會帶來額外的跨帶開銷。而且當Session之遙有變化時,就需要同步。假設Session裏面的信息量比較大。那個會佔用至關大的內存消耗。post

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數據庫也可以。 你們假設有什麼好的建議可以一塊兒學習。

相關文章
相關標籤/搜索