架構設計(五):有狀態服務和無狀態服務

Grey Zeng發表於2022-12-17

架構設計(五):有狀態服務和無狀態服務

作者:Grey

原文地址:

部落格園:架構設計(五):有狀態服務和無狀態服務

CSDN:架構設計(五):有狀態服務和無狀態服務

無狀態的服務

在橫向擴充套件服務的過程中,將狀態(例如使用者會話資料)從服務中移出並將會話資料儲存在永續性儲存介質中,如關係型資料庫或 NoSQL。叢集中的每個服務都可以從資料庫中訪問狀態資料。這就是所謂的無狀態服務。架構如下

img

有狀態的服務

和無狀態服務不一樣,有狀態的服務從一個請求到下一個請求都會記住客戶資料(狀態)。而無狀態伺服器不保留任何狀態資訊,架構如下

img

上圖中,如果使用有狀態服務,使用者1的狀態資料(比如:會話資料和資料圖片)都儲存在Server 1中。如果這是一個驗證使用者身份的服務,為了驗證使用者1,請求必須被髮送到 Server 1 上。如果請求被髮送到其他伺服器,如 Server 2,認證將失敗,因為 Server 2 不包含使用者 A 的會話資料。同樣地,來自使用者2的所有請求必須被路由到 Server 2;來自使用者3的所有請求必須被髮送到 Server 3。

這就會導致一個問題:來自同一個客戶端的每個請求都必須被路由到同一個伺服器。雖然可以透過負載均衡器的粘性會話來完成這個功能,但是這增加系統複雜度和開銷。使用這種方法,在增加或刪除服務的時候比較困難。

使用無狀態服務,來自使用者的請求可以被髮送到任何服務節點,這些服務節點從共享資料儲存中獲取狀態資料。狀態資料被儲存在共享資料儲存中。無狀態系統更簡單、更穩健、可擴充套件。

無狀態服務中的共享資料儲存可以是一個關係型資料庫、Memcached/Redis、NoSQL等。選擇 NoSQL 資料儲存是因為它很容易擴充套件。可以實現自動縮放(根據流量負載自動新增或刪除服務)。在狀態資料被單獨存放在一個共享儲存以後,透過根據流量負載新增或刪除服務,可以很容易地實現網路層的自動擴充套件。

參考資料

System Design Interview

相關文章