分散式web架構中對session同步的常用處理方法以及優缺點

来源:http://www.cnblogs.com/hohoa/archive/2017/08/06/7256758.html
-Advertisement-
Play Games

寫在前面 最近在讀一本來自淘寶技術團隊大牛的書,名字叫《大型網站系統與Java中間件實踐》。開篇的章節詳細地介紹了一個網站架構由小變大不斷演進的過程,其中從單機架構升級到集群架構的過程中著重介紹了關於session同步問題, 這也是很多人在聊到分散式時繞不過去的話題。下麵就整理下書中的內容,也算是做 ...


寫在前面

最近在讀一本來自淘寶技術團隊大牛的書,名字叫《大型網站系統與Java中間件實踐》。開篇的章節詳細地介紹了一個網站架構由小變大不斷演進的過程,其中從單機架構升級到集群架構的過程中著重介紹了關於session同步問題, 這也是很多人在聊到分散式時繞不過去的話題。下麵就整理下書中的內容,也算是做個讀書筆記,方便以後參考。


問題從哪來

做web開發的同學應該對session再熟悉不過,它是伺服器分配給客戶端的會話標識,瀏覽器每次請求會帶上這個標識來告訴伺服器我是誰,伺服器會在記憶體中存儲這些不同的會話信息,由此來分辨請求來自哪個會話。在單機部署的環境總,因為web伺服器和session都是在同一臺機器上,所以必然能找到對應的會話數據。但如果有2台web伺服器(A和B)提供服務,假如第一次請求落到A上並創建了session,那麼如何保證下次落到B的請求能讀到session數據?

解決方案

有以下4中常見的解決方案。

1、Session Sticky

這是最簡單粗暴的 方法,核心思路就是讓同一會話的請求都落地到同一臺伺服器上,這樣處理起來就和單機一樣了,我們可以在負載均衡上做一些身份識別並控制轉發來達到這個目的。這樣做的優勢是能像單機一樣簡化對session處理,也方便做本地緩存,但缺點也是很明顯的:

  • 如果這台伺服器宕機或重啟了,那麼所以的會話數據都會丟失,失去了分散式集群帶來的高可用特性。

  • 增加了負載均衡器的負擔,使它變得有狀態了,而且資源消耗會更大,容易成為性能瓶頸。

2、Session Replication

顧名思義,這是一種session複製的方案,核心思路就是通過在伺服器之間增加session同步機制來保證數據一致。

看起來比第一種簡單了很多,也沒有第一種帶來的缺陷,但在某些應用場景下還是會有比較嚴重的問題:

  • 伺服器之間的數據同步帶來了額外的網路消耗,隨著機器數量和數據量的上升,網路帶寬將會有很大的壓力,也必然會帶來延時問題。

  • 每台伺服器上都要存儲所有的會話數據,如果會話數量很大會占用伺服器大部分記憶體空間。

目前很多應用容器都支持這種同步方式,所以在集群規模和數據量比較小的時候還是一種很好的解決方案。

3、Session集中存儲

這種方式的思路就是把所有的會話數據統一存儲和管理,所有應用伺服器需要對session進行讀寫都要通過session伺服器來操作:

這種方案的好處是獨立了session的管理,職責單一化,session伺服器採用什麼方式存儲(記憶體、資料庫、文檔、NoSql等等),什麼方式對外提供服務都是透明的。不會給應用系統和負載均衡帶來額外的開銷,不需要進行數據同步就能保證一致性,看起來應該是非常完美了,不過也有自己的一些小缺陷:

  • 對session讀寫需要網路操作,相比較session直接存儲在web伺服器的時候增加了時延和不穩定性,好在session伺服器和web伺服器一般是部署在區域網中,可以最大化減少這個問題。

  • session伺服器出現問題將影響所有web服務,如果採用多機部署同時也會帶來數據一致性問題。

每種方案帶有它獨特的優勢,同時也會帶來相應的新問題,正所謂沒有十全十美,只有適合才是最好的。總體來說,這種方案在應用伺服器和會話數據量都很大的時候還是非常有優勢的。

4、Cookie Base

 這種方案是基於cookie的傳輸來實現的,核心思想很簡單,就是把完整的會話數據經過處理後寫入到客戶端cookie,以後客戶端每次請求都帶上這個cookie,然後服務端通過解析cookie數據來獲取會話信息,如下圖所示:

這種方案簡單明瞭,也沒有前面幾種方案帶來的問題,但劣勢也非常明顯:

  • 首先通過cookie來傳遞關鍵數據肯定是不安全的,即便是採用了特殊的加密手段。

  • 如果客戶端禁用了cookie,將直接導致服務不可用。

  • cookie的數據是有大小限制的,如果傳遞的數據超出限制大小,將會導致數據異常。

  • 在http請求中攜帶大量的數據進行傳輸會增加網路負擔,同樣,服務端響應大量數據會導致請求變慢,併發量大的時候會非常可怕。

總結

以上4種方案都是可行的方案,正如前面所說,每種方案各有優劣,不會十全十美,實際應用中要根據需求做權衡和取捨。這些都是屬於比較通用的方案,我相信在真正的實踐和落地過程中還會有其他問題出現,有經驗的過來人或許會有一些另闢蹊徑的“套路”,歡迎討論交流。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • /** * 剪切一個文件夾,且文件夾中包含內容,有問題的地方大家可以指出 */import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileI ...
  • 本節作業: 熟練使用類和模塊,寫一個交互性強、有衝突的程式。 一、作業目的 1、規範程式寫法,要按照模塊來規範書寫; 2、類的使用,文件之間的調用練習; 3、思路的開闊,自己編寫衝突,實現調用; 4、對基礎知識的熟練掌握。 本文寫了一個決鬥系統,兩個男的為了一個女的進行決鬥,獲勝者贏得美女放心,失敗 ...
  • 本文介紹將各種Spring的配置方式,幫助您瞭解配置Spring應用的複雜性。Spring是一個非常受歡迎的Java框架,它用於構建web和企業應用。不像許多其他框架只關註一個領域,Spring框架提供了各種功能,通過項目組合來滿足當代業務需求。Spring框架提供了多種靈活的方式配置Bean。例如... ...
  • mybatis 詳解(四)------properties以及別名定義 ...
  • 目錄 · 總述 · 記憶 · 效果 · 面向對象設計原則 · 創建型模式 · 單例模式(Singleton) · 效果 · 分類 · 代碼(餓漢式) · 代碼(懶漢式) · 代碼(雙重檢測鎖式) · 代碼(靜態內部類式) · 代碼(枚舉單例) · 代碼(使用反射的破解與防禦) · 代碼(使用序列化的 ...
  • 定義(百度百科): 責任鏈模式是一種設計模式。在責任鏈模式里,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發出這個請求的客戶端並不知道鏈上的哪一個對象最終處理這個請求,這使得系統可以在不影響客戶端的情況下動態地重新組織和分配責任。 ...
  • 最近看完了 backbone.js 的源碼,這裡對於源碼的細節就不再贅述了,大家可以 star 我的源碼閱讀項目(https://github.com/JiayiLi/source-code-study)進行參考交流,有詳細的源碼註釋,以及知識總結,同時 google 一下 backbone 源碼, ...
  • A代碼編輯器,線上模版編輯,仿開發工具編輯器,pdf線上預覽,文件轉換編碼B 集成代碼生成器 [正反雙向](單表、主表、明細表、樹形表,快速開發利器)+快速表單構建器 freemaker模版技術 ,0個代碼不用寫,生成完整的一個模塊,帶頁面、建表sql腳本,處理類,service等完整模塊C 集成阿 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...