解讀分布式web架構中Session管理(lǐ)方法的(de)優缺點
做(zuò)web開發的(de)同學(xué)應該對session再熟悉不過,它是服務器分配給客戶端的(de)會話标識,浏覽器每次請求會帶上這個标識來告訴服務器我是誰,服務器會在內(nèi)存中存儲這些不同的(de)會話信息,由此來分辨請求來自(zì)哪個會話。在單機部署的(de)環境總,因為(wèi)web服務器和(hé)session都是在同一(yī)台機器上,所以必然能找到對應的(de)會話數據。但如(rú)果有2台web服務器(A和(hé)B)提供服務,假如(rú)第一(yī)次請求落到A上并創建了session,海瑤網站建設公司解讀如(rú)何保證下次落到B的(de)請求能讀到session數據?
解決方案
有以下4中常見的(de)解決方案。
1、Session Sticky
這是最簡單粗暴的(de) 方法,核心思路就是讓同一(yī)會話的(de)請求都落地(dì)到同一(yī)台服務器上,這樣處理(lǐ)起來就和(hé)單機一(yī)樣了,我們可(kě)以在負載均衡上做(zuò)一(yī)些身份識别并控制轉發來達到這個目的(de)。這樣做(zuò)的(de)優勢是能像單機一(yī)樣簡化對session處理(lǐ),也方便做(zuò)本地(dì)緩存,但缺點也是很明顯的(de):
如(rú)果這台服務器宕機或重啓了,那麽所以的(de)會話數據都會丢失,失去(qù)了分布式集群帶來的(de)高(gāo)可(kě)用特性。
增加了負載均衡器的(de)負擔,使它變得有狀态了,而且資源消耗會更大,容易成為(wèi)性能瓶頸。
2、Session Replication
顧名思義,這是一(yī)種session複制的(de)方案,核心思路就是通過在服務器之間增加session同步機制來保證數據一(yī)緻。
看起來比第一(yī)種簡單了很多,也沒有第一(yī)種帶來的(de)缺陷,但在某些應用場景下還是會有比較嚴重的(de)問題:
服務器之間的(de)數據同步帶來了額外的(de)網絡消耗,随着機器數量和(hé)數據量的(de)上升,網絡帶寬将會有很大的(de)壓力,也必然會帶來延時問題。
每台服務器上都要存儲所有的(de)會話數據,如(rú)果會話數量很大會占用服務器大部分內(nèi)存空間。
目前很多應用容器都支持這種同步方式,所以在集群規模和(hé)數據量比較小的(de)時候還是一(yī)種很好的(de)解決方案。
3、Session集中存儲
這種方式的(de)思路就是把所有的(de)會話數據統一(yī)存儲和(hé)管理(lǐ),所有應用服務器需要對session進行讀寫都要通過session服務器來操作:
這種方案的(de)好處是獨立了session的(de)管理(lǐ),職責單一(yī)化,session服務器采用什麽方式存儲(內(nèi)存、數據庫、文檔、NoSql等等),什麽方式對外提供服務都是透明的(de)。不會給應用系統和(hé)負載均衡帶來額外的(de)開銷,不需要進行數據同步就能保證一(yī)緻性,看起來應該是非常完美了,不過也有自(zì)己的(de)一(yī)些小缺陷:
對session讀寫需要網絡操作,相比較session直接存儲在web服務器的(de)時候增加了時延和(hé)不穩定性,好在session服務器和(hé)web服務器一(yī)般是部署在局域網中,可(kě)以最大化減少這個問題。
session服務器出現問題将影響所有web服務,如(rú)果采用多機部署同時也會帶來數據一(yī)緻性問題。
每種方案帶有它獨特的(de)優勢,同時也會帶來相應的(de)新問題,正所謂沒有十全十美,隻有适合才是最好的(de)。總體來說,這種方案在應用服務器和(hé)會話數據量都很大的(de)時候還是非常有優勢的(de)。
4、Cookie Base
這種方案是基于cookie的(de)傳輸來實現的(de),核心思想很簡單,就是把完整的(de)會話數據經過處理(lǐ)後寫入到客戶端cookie,以後客戶端每次請求都帶上這個cookie,然後服務端通過解析cookie數據來獲取會話信息,如(rú)下圖所示:
這種方案簡單明了,也沒有前面幾種方案帶來的(de)問題,但劣勢也非常明顯:
首先通過cookie來傳遞關鍵數據肯定是不安全的(de),即便是采用了特殊的(de)加密手段。
如(rú)果客戶端禁用了cookie,将直接導緻服務不可(kě)用。
cookie的(de)數據是有大小限制的(de),如(rú)果傳遞的(de)數據超出限制大小,将會導緻數據異常。
在http請求中攜帶大量的(de)數據進行傳輸會增加網絡負擔,同樣,服務端響應大量數據會導緻請求變慢,并發量大的(de)時候會非常可(kě)怕。
總結
以上4種方案都是可(kě)行的(de)方案,正如(rú)前面所說,每種方案各有優劣,不會十全十美,實際應用中要根據需求做(zuò)權衡和(hé)取舍。這些都是屬于比較通用的(de)方案,我相信在真正的(de)實踐和(hé)落地(dì)過程中還會有其他問題出現,有經驗的(de)過來人或許會有一(yī)些另辟蹊徑的(de)“套路”,歡迎讨論交流。
編輯:--ns868