常常會看到HTTP
是Stateless(無狀態)的,但是到底什麼是無狀態? 跟有狀態又有什麼差別呢?
剛好看到一篇不錯的文,這邊把它翻譯並整理起來,之後可以回來複習。
有狀態 Stateful
要能夠清楚地理解無狀態,那就必須先搞懂有狀態是什麼。
在電腦的系統裡,所謂狀態(State)指得是某個東西在某個時間點下的狀況,而有狀態(Stateful)的意思則是,輸出的值會依賴不同時間點下的狀態而改變。
比如說在二進制的系統,1跟0分別代表著”On”與”Off”。一個系統不能同時為1和0。
現在想像一個狀況,我如果給你一張紙請你依據現在的狀態寫下答案:
如果狀態是0,請寫下”Yes”,如果是1,請寫下”No”
這就是一個有狀態(Stateful)的系統,你的答案會隨著狀態不同而改變,你無法在不知道狀態的情況下作答。
那什麼是有狀態的Web Service?
假設你要準備要登入一個網站,你輸入了你的帳號及密碼。如果網站的伺服器將你的資料存在後台,每次登入時就會利用儲存的資料來驗證你的身分的話,我們可以說這個登入服務就是有狀態的。
當你使用該服務時,對你每個操作都會參考已經預先存好的狀態(這邊指使用者資料),當你請求一個帳戶資料的頁面時,伺服器會做兩件事:
- 誰在請求?
- 根據請求者的ID,要秀出什麼頁面給他們看?
像這樣有狀態的網路服務,對每個GET
請求的回覆都必須要依賴儲存在伺服器裡的狀態,如果沒有這個狀態就無法正確的回傳資料。
聽起來好像沒什麼問題啊? 但其實不盡然。
有狀態的網路服務其實只能應用在非常少數的情況,並且會有不少的問題。
首先,如果你必須要參考某個狀態才能作回覆,將可能面對到許多不完整的session
或是transaction
的狀況。什麼意思呢? 假設在一個有狀態的系統,伺服器的狀態決定於客戶端。此時假如某個客戶端請求了一筆資料,那伺服器要維持連線狀態多久? 伺服器要如何知道客戶端是不是連線失敗或是斷線了? 又或者我們要如何追蹤使用者的操作及同時記錄每個操作所帶來的更動,然後在需要時還要能夠返回呢?
雖然這些問題都會有一些解決方法,但是其實大部分的客戶端都能夠即時且正確地回覆伺服器,也因為這樣,讓伺服器單方面的去維持狀態是很浪費且不必要的。
無狀態 Stateless
不同於有狀態,無狀態(Stateless)可以說是現代網際網路的基礎,幾乎在每個面向都應用了無狀態的服務。例如你在讀網路新聞時使用了HTTP
,在滑Facebook
時使用了Facebook REST API
來調出版面上的貼文。
每個伺服器的回覆都不依賴任何存於伺服器的狀態,而是以快取的形式存在客戶端。
這邊來看一個POST
的例子:
POST http://HypotheticalService/Entity
Host: HypotheticalService
Content-Type: text/xml; charset=utf-8
Content-Length: 123
<!--?xml version="1.0" encoding="utf-8"?-->
<entity>
<id>1</id>
<title>Example</title>
<content>This is an example</content>
</entity>
這個範例中我們創建了一筆資料,而這個資料並不依賴於任何的狀態。意思就是我們不需要等待伺服器來確認我們的操作是否被正確地處理了。
像是REST
(Representational State Transfer)就是一個無狀態的設計概念,重點在於必須在發出請求時,將所有處理該請求的必要資料都包含在請求裡,這樣也就不需要依賴於伺服器裡的狀態。
參考來源: https://nordicapis.com/defining-stateful-vs-stateless-web-services/