有狀態服務還是無狀態服務

2022-04-01 05:40:10 字數 898 閱讀 4149

無狀態服務:就是沒有特殊狀態的服務,各個請求對於伺服器來說統一無差別處理,請求自身攜帶了所有服務端所需要的所有引數(服務端自身不儲存跟請求相關的任何資料,不包括資料庫儲存資訊)

有狀態服務:與之相反,有狀態服務在服務端保留之前請求的資訊,用以處理當前請求,比如session等

如何選擇:

有狀態服務常常用於實現事務(並不是唯一辦法,下文有另外的方案)。舉乙個常見的例子,在**裡購買一件商品。需要經過放入購物車、確認訂單、付款等多個步驟。由於http協議本身是無狀態的,所以為了實現有狀態服務,就需要通過一些額外的方案。比如最常見的session,將使用者挑選的商品(購物車),儲存到session中,當付款的時候,再從購物車裡取出商品資訊

有狀態服務可以很容易地實現事務,所以也是有價值的。但是經常聽到一種說法,即server要設計為無狀態的,這主要是從可伸縮性來考慮的。如果server是無狀態的,那麼對於客戶端來說,就可以將請求傳送到任意一台server上,然後就可以通過負載均衡等手段,實現水平擴充套件。如果server是有狀態的,那麼就無法很容易地實現了,因為客戶端需要始終把請求發到同一臺server才行,所謂「session遷移」等方案,也就是為了解決這個問題

有狀態服務和無狀態服務各有優劣,它們在一些情況下是可以轉換的,或者有時候可以共用,並非一定要全部否定.

1.基於資料庫的session共享

2.基於nfs共享檔案系統

3.基於memcached 的session

4. 基於resin/tomcat web容器本身的session複製機制

5. 基於tt/redis 或 jbosscache 進行 session 共享

6. 基於cookie 進行session共享

或者在業務實現上,將上下文需要的資訊在請求中返回,在客戶端中進行儲存,只不過,這個方案存在技術風險,需要用一定的手段規避

無狀態服務 VS 有狀態服務

對伺服器程式來說,究竟是有狀態服務,還是無狀態服務,其判斷依舊是指兩個來自相同發起者的請求在伺服器端是否具備上下文關係。如果是狀態化請求,那麼伺服器端一般都要儲存請求的相關資訊,每個請求可以預設地使用以前的請求資訊。而對於無狀態請求,伺服器端所能夠處理的過程必須全部來自於請求所攜帶的資訊,以及其他伺...

無狀態服務VS有狀態服務

在網易蜂巢的服務管理中存在兩種服務 無狀態服務和有狀態服務。無狀態服務 stateless service 是指該服務執行的例項不會在本地儲存需要持久化的資料,並且多個例項對於同乙個請求響應的結果是完全一致的。這類服務在網易蜂巢雲平台建立後,借助k8s內部的負載均衡,當訪問該服務的請求到達服務一端後...

有狀態服務和無狀態服務

伺服器端需要保留請求的相關資訊,每個請求可以預設的使用以前的請求資訊 相比無狀態的 web 伺服器請求,狀態化的伺服器似乎有更為廣闊的應用場景,比如網路遊戲伺服器等。無狀態的服務可以在伺服器中維護每乙個連線的狀態資訊,當服務端接收到每個連線請求時候,可以從本地儲存的資訊來重現上下文。基於有狀態的服務...