無狀態服務(stateless service)

1、定義 

無狀態服務(stateless service)對單次請求的處理,不依賴其餘請求,也就是說,處理一次請求所需的所有信息,要麼都包含在這個請求裏,要麼能夠從外部獲取到(好比說數據庫),服務器自己不存儲任何信息 

有狀態服務(stateful service)則相反,它會在自身保存一些數據,前後的請求是有關聯的 

2、優劣 

有狀態服務經常用於實現事務(並非惟一辦法,下文有另外的方案)。舉一個常見的例子,在商城裏購買一件商品。須要通過放入購物車、確認訂單、付款等多個步驟。因爲HTTP協議自己是無狀態的,因此爲了實現有狀態服務,就須要經過一些額外的方案。好比最多見的session,將用戶挑選的商品(購物車),保存到session中,當付款的時候,再從購物車裏取出商品信息 

有狀態服務能夠很容易地實現事務,因此也是有價值的。可是常常聽到一種說法,即server要設計爲無狀態的,這主要是從可伸縮性來考慮的。若是server是無狀態的,那麼對於客戶端來講,就能夠將請求發送到任意一臺server上,而後就能夠經過負載均衡等手段,實現水平擴展。若是server是有狀態的,那麼就沒法很容易地實現了,由於客戶端須要始終把請求發到同一臺server才行,所謂「session遷移」等方案,也就是爲了解決這個問題 

 

3、session和cookie 

基於session和cookie均可以實現事務,能夠認爲,session是有狀態的,而cookie是無狀態的 

4、無狀態實現事務的方法 

並非必定要用有狀態服務才能實現事務,本文提供另外的幾種方案做爲參考 
舉一個屢次提交的場景做爲例子:用戶須要提交不少數據,分爲2個頁面提交 

 

這裏就涉及到2次http請求,第一次提交字段一、二、3,第二次提交字段四、五、6 

用session很容易實現這個需求,server只須要將第一次提交的數據,保存在session裏,而後返回第2個表單做爲相應;而後取出第一次提交的數據,和第二次提交的數據匯聚之後,一塊兒存入數據庫便可 

不用session一樣也能夠實現,server接收到第一次請求之後,將數據做爲隱藏元素,放在第2個表單裏返回;這樣用戶第2次提交的時候,就隱含地再次提交了第一次的數據;server將全部數據存入數據庫 
用HTML5,則還能夠進一步優化,client能夠將第一次提交的數據,保存在sessionStorage裏 
用cookie也是相似的道理,一樣能夠實現,可是不太好 

總的來講,3種替代方案(隱藏表單元素、sessionStorage、cookie)都避免了在server端暫存數據,從而實現了stateless service。本質上,這3種方案的請求裏,都包含了全部必須的數據,符合本文一開始的定義 

5、將有狀態服務轉換成無狀態服務 

根據本文一開始的定義,除了將全部信息都放在請求裏以外,還有另一種方法能夠實現無狀態服務,即將信息放在一個單獨可共享的地方,獨立於server存在 
好比,一樣仍是採起session的方式,在服務端保存數據,減小每次client請求傳輸的數據量(節省流量);可是將session集中存放,好比放在單獨的session層裏。這種狀況下,server一樣是無狀態的,能夠作水平擴展 

 

6、無狀態類 

引伸一下,JAVA裏有一種類的設計,能夠稱爲無狀態類。這種類的特徵是隻有方法沒有字段,在三層架構(展示層、邏輯層、持久層)裏,邏輯層常常能夠看到這種類 
我以爲無狀態類和stateless server在思想上是同樣的,這個類自己是沒有狀態的,因此當外部要調用它的方法時,須要在方法參數中傳來所需的全部信息,不依賴該類自身的狀態(字段值),在併發環境下,能夠避免多線程帶來的反作用 

7、總結 

有狀態服務能夠比較容易地實現事務,在不須要考慮水平擴展時,是比較好的選擇 
無狀態服務的優點在於能夠很方便地水平伸縮,可是在實現事務時,須要作一些額外的動做 
能夠經過剝離session等方法,將一個有狀態服務,轉換成無狀態服務 

關於這個話題,下面這個連接也不錯: 
http://stackoverflow.com/questions/4495950/how-do-stateless-servers-work數據庫

相關文章
相關標籤/搜索