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

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

作者: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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章