系統設計架構:有狀態與無狀態

banq發表於2022-06-21

設計一個應該易於擴充套件的系統時,您首先要嘗試擴充套件系統的不同元件。
在客戶端層,你有你的客戶端裝置,可以是桌上型電腦或移動裝置
在應用層,您將擁有CDN負載均衡器、應用伺服器或 Web 伺服器以及其他使用者管理實用程式。
在資料庫層,您將擁有源資料庫和複製資料庫。
當涉及到使用者會話時,您打算將這些會話儲存在哪裡?
您不能將它們儲存在應用程式層中,因為應用程式伺服器將具有快取的記憶體儲存來更新使用者會話。
這引入了持久儲存使用者會話的需求。儲存使用者會話的最佳位置是在資料庫層內。如何儲存它取決於您嘗試選擇的架構型別。
有兩種型別的體系結構用於儲存使用者會話狀態。

有狀態的架構:
要求使用者登入其帳戶的身份驗證會話需要維護會話狀態。其他多動作過程也需要維護會話。在有狀態架構中,伺服器儲存從一個請求到下一個請求的客戶端狀態。
當使用者轉到他們以前從未登入過的其他裝置(例如手機或桌上型電腦)時,最初他們最初需要一個身份驗證過程,例如2FA,然後才能將該裝置的使用者會話狀態儲存到伺服器上。所以會話狀態實際上是儲存在伺服器上的。
下圖顯示了有狀態架構的設計方式。

系統設計架構:有狀態與無狀態
有狀態架構在單個伺服器上儲存和維護使用者會話。來自該使用者的 HTTP 請求無法路由到另一臺伺服器,因為響應將失敗。
因此,來自使用者的所有請求都必須路由到其指定的伺服器以訪問該使用者的狀態。這使得架構很難擴充套件,因為新增或刪除伺服器會導致從使用者收到的請求中出現許多故障點問題。
為了確保這種架構的可行性,我們可以在負載均衡器中使用粘性會話。但是,這會增加很多開銷。

無狀態架構

一個無狀態服務作為一個整體通常仍然需要以某種形式處理狀態。無狀態只是指在伺服器端會話中不跟蹤此狀態的事實。
在無狀態架構中,來自使用者的 HTTP 請求可以傳送到任何 Web 伺服器,因為使用者會話不是儲存在應用層,而是儲存在資料庫層的共享儲存空間中。
過去,客戶端裝置在處理維護會話的額外複雜性方面的硬體和軟體能力非常有限。因此,大部分繁重的工作都是在伺服器端完成的。

系統設計架構:有狀態與無狀態
然而,由於技術進步以及基礎設施和計算能力的多樣化增長,不充當伺服器的個人和專業計算裝置已經足夠強大以處理會話狀態。
這種架構的美妙之處在於,當我們將儲存使用者會話資料的想法從應用層轉移到持久資料儲存層時,它可以讓系統更加簡單和可擴充套件。
根據網路流量在應用程式層自動縮放 Web 伺服器的額外靈活性使您不必擔心開銷。

相關文章