系統設計架構:有狀態與無狀態
設計一個應該易於擴充套件的系統時,您首先要嘗試擴充套件系統的不同元件。
在客戶端層,你有你的客戶端裝置,可以是桌上型電腦或移動裝置
在應用層,您將擁有CDN、負載均衡器、應用伺服器或 Web 伺服器以及其他使用者管理實用程式。
在資料庫層,您將擁有源資料庫和複製資料庫。
當涉及到使用者會話時,您打算將這些會話儲存在哪裡?
您不能將它們儲存在應用程式層中,因為應用程式伺服器將具有快取的記憶體儲存來更新使用者會話。
這引入了持久儲存使用者會話的需求。儲存使用者會話的最佳位置是在資料庫層內。如何儲存它取決於您嘗試選擇的架構型別。
有兩種型別的體系結構用於儲存使用者會話狀態。
有狀態的架構:
要求使用者登入其帳戶的身份驗證會話需要維護會話狀態。其他多動作過程也需要維護會話。在有狀態架構中,伺服器儲存從一個請求到下一個請求的客戶端狀態。
當使用者轉到他們以前從未登入過的其他裝置(例如手機或桌上型電腦)時,最初他們最初需要一個身份驗證過程,例如2FA,然後才能將該裝置的使用者會話狀態儲存到伺服器上。所以會話狀態實際上是儲存在伺服器上的。
下圖顯示了有狀態架構的設計方式。
有狀態架構在單個伺服器上儲存和維護使用者會話。來自該使用者的 HTTP 請求無法路由到另一臺伺服器,因為響應將失敗。
因此,來自使用者的所有請求都必須路由到其指定的伺服器以訪問該使用者的狀態。這使得架構很難擴充套件,因為新增或刪除伺服器會導致從使用者收到的請求中出現許多故障點問題。
為了確保這種架構的可行性,我們可以在負載均衡器中使用粘性會話。但是,這會增加很多開銷。
無狀態架構
一個無狀態服務作為一個整體通常仍然需要以某種形式處理狀態。無狀態只是指在伺服器端會話中不跟蹤此狀態的事實。
在無狀態架構中,來自使用者的 HTTP 請求可以傳送到任何 Web 伺服器,因為使用者會話不是儲存在應用層,而是儲存在資料庫層的共享儲存空間中。
過去,客戶端裝置在處理維護會話的額外複雜性方面的硬體和軟體能力非常有限。因此,大部分繁重的工作都是在伺服器端完成的。
然而,由於技術進步以及基礎設施和計算能力的多樣化增長,不充當伺服器的個人和專業計算裝置已經足夠強大以處理會話狀態。
這種架構的美妙之處在於,當我們將儲存使用者會話資料的想法從應用層轉移到持久資料儲存層時,它可以讓系統更加簡單和可擴充套件。
根據網路流量在應用程式層自動縮放 Web 伺服器的額外靈活性使您不必擔心開銷。
相關文章
- 架構設計(五):有狀態服務和無狀態服務架構
- 【架構設計】無狀態狀態機在程式碼中的實踐架構
- 有狀態和無狀態的區別
- SAP Fiori和WebClient UI的有狀態和無狀態行為設計原理WebclientUI
- 狀態機設計
- 系統狀態統計和檢視
- Spring Bean Scope 有狀態的Bean和無狀態的BeanSpringBean
- 前端狀態管理與有限狀態機前端
- 關於有狀態和無狀態會話bean的解釋 (轉)會話Bean
- 工作流從無狀態切換到有狀態的好處
- 無廢話設計模式(14)結構型模式--狀態模式設計模式
- 設計模式-狀態模式設計模式
- 設計模式:狀態模式設計模式
- SAP BSP應用有狀態和無狀態行為差異比較
- React 狀態管理:狀態與生命週期React
- Asp.NET系統狀態與物件管理ASP.NET物件
- 無狀態協議協議
- [譯] 使用原生 JavaScript 構建狀態管理系統JavaScript
- Vuex 單狀態庫 與 多模組狀態庫Vue
- 設計模式(十五)狀態模式設計模式
- 設計模式之——狀態模式設計模式
- javascript設計模式狀態模式JavaScript設計模式
- 設計模式(六):狀態模式設計模式
- 用設計模式去掉沒必要的狀態變數 —— 狀態模式設計模式變數
- cookie儲存使用者狀態 無session系統CookieSession
- 理解vuex的狀態管理模式架構Vue模式架構
- 系統狀態檢視工具Sysstat
- Vue同構(三): 狀態與資料Vue
- flink 有狀態(stateful)的計算
- PHP 設計模式之狀態模式PHP設計模式
- 簡說設計模式——狀態模式設計模式
- 設計模式之狀態模式(State)設計模式
- 設計模式-狀態模式(State Pattern)設計模式
- python設計模式狀態模式Python設計模式
- 設計模式20之狀態模式設計模式
- 極簡設計模式-狀態模式設計模式
- GoLang設計模式14 - 狀態模式Golang設計模式
- Python設計模式-狀態模式Python設計模式