架構設計(五):有狀態服務和無狀態服務
作者:Grey
原文地址:
無狀態的服務
在橫向擴展服務的過程中,將狀態(例如用戶會話數據)從服務中移出並將會話數據存儲在持久性存儲介質中,如關係型數據庫或 NoSQL。集羣中的每個服務都可以從數據庫中訪問狀態數據。這就是所謂的無狀態服務。架構如下
有狀態的服務
和無狀態服務不一樣,有狀態的服務從一個請求到下一個請求都會記住客戶數據(狀態)。而無狀態服務器不保留任何狀態信息,架構如下
上圖中,如果使用有狀態服務,用戶1的狀態數據(比如:會話數據和資料圖片)都存儲在Server 1中。如果這是一個驗證用戶身份的服務,爲了驗證用戶1,請求必須被髮送到 Server 1 上。如果請求被髮送到其他服務器,如 Server 2,認證將失敗,因爲 Server 2 不包含用戶 A 的會話數據。同樣地,來自用戶2的所有請求必須被路由到 Server 2;來自用戶3的所有請求必須被髮送到 Server 3。
這就會導致一個問題:來自同一個客戶端的每個請求都必須被路由到同一個服務器。雖然可以通過負載均衡器的粘性會話來完成這個功能,但是這增加系統複雜度和開銷。使用這種方法,在增加或刪除服務的時候比較困難。
使用無狀態服務,來自用戶的請求可以被髮送到任何服務節點,這些服務節點從共享數據存儲中獲取狀態數據。狀態數據被存儲在共享數據存儲中。無狀態系統更簡單、更穩健、可擴展。
無狀態服務中的共享數據存儲可以是一個關係型數據庫、Memcached/Redis、NoSQL等。選擇 NoSQL 數據存儲是因爲它很容易擴展。可以實現自動縮放(根據流量負載自動添加或刪除服務)。在狀態數據被單獨存放在一個共享存儲以後,通過根據流量負載添加或刪除服務,可以很容易地實現網絡層的自動擴展。