無狀態服務:就是沒有特殊狀態的服務,各個請求對於服務器來說統一無差別處理,請求自身攜帶了所有服務端所需要的所有參數(服務端自身不存儲跟請求相關的任何數據,不包括數據庫存儲信息)
有狀態服務:與之相反,有狀態服務在服務端保留之前請求的信息,用以處理當前請求,比如session等
如何選擇:
有狀態服務常常用於實現事務(並不是唯一辦法,下文有另外的方案)。舉一個常見的例子,在商城里購買一件商品。需要經過放入購物車、確認訂單、付款等多個步驟。由於HTTP協議本身是無狀態的,所以為了實現有狀態服務,就需要通過一些額外的方案。比如最常見的session,將用戶挑選的商品(購物車),保存到session中,當付款的時候,再從購物車里取出商品信息
有狀態服務可以很容易地實現事務,所以也是有價值的。但是經常聽到一種說法,即server要設計為無狀態的,這主要是從可伸縮性來考慮的。如果server是無狀態的,那么對於客戶端來說,就可以將請求發送到任意一台server上,然后就可以通過負載均衡等手段,實現水平擴展。如果server是有狀態的,那么就無法很容易地實現了,因為客戶端需要始終把請求發到同一台server才行,所謂“session遷移”等方案,也就是為了解決這個問題
有狀態服務和無狀態服務各有優劣,它們在一些情況下是可以轉換的,或者有時候可以共用,並非一定要全部否定.
在一定需要處理請求上下文的情況下又想使用無狀態服務,可以將相關的請求信息存儲到共享內存中或者數據庫中,參考分布式session的實現方式:
1.基於數據庫的Session共享
2.基於NFS共享文件系統
3.基於memcached 的session
4. 基於resin/tomcat web容器本身的session復制機制
5. 基於TT/Redis 或 jbosscache 進行 session 共享
6. 基於cookie 進行session共享
或者在業務實現上,將上下文需要的信息在請求中返回,在客戶端中進行存儲,只不過,這個方案存在技術風險,需要用一定的手段規避
