天天看點

有狀态服務和無狀态服務

概念

服務一般分為有狀态服務(Stateful Service)和無狀态服務(Stateless Service)。它們的差別是,當請求發起後,服務在服務端運作時是否需要關聯上下文。

有狀态服務,服務端需要儲存請求的資訊,并且其它請求還可以使用已儲存的資訊。

無狀态服務,服務端處理邏輯中所需要的資料,全部來此本次請求中帶的資訊。雖然服務端也儲存了一些資訊,但是這些資訊要麼與請求無關,要麼所有請求都可以公用。

差別

無狀态服務可以有一個或多個執行個體;有狀态服務隻有一個執行個體。

請求和請求間沒有強關聯關系,是以無狀态服務實作擴充比較友善,請求可以發送至任意服務上去,而不用考慮請求切換問題。

有狀态服務可以實作事務,事務簡單來說就是多件事情組成一個集合,集合中沒見事情要全部正确完成了,這個集合才算完成。如果集合中的事情有一個沒有完成,即使其他事情完成了,也得将已完成的事情的相關資料恢複到原來的狀态,就是復原。

比如說,同一個使用者的業務邏輯,多次請求的資料可以存放在session中,當另外的幾個請求處理完成後,從session中取出資料完成最終的處理。

實作事務,session和cookie都可以,一般session可看作是有狀态的,cookie是無狀态的。

那麼有狀态服務友善實作事務,無狀态服務其實也能實作事務。

無狀态服務實作事務有這幾種辦法:

1、用session

無狀态服務雖然每次請求沒有關聯,但是對于同一個使用者session卻是公用的,是以可以将幾次請求的資料放在session中,完成資料的傳遞。

2、隐藏表單

當第一個請求傳遞了資料到服務端後,可以将第一個請求的資料作為另一個請求中某個表單的隐藏資料,當另一個請求送出時将這個隐藏資料取出來合并到一起送出。

3、用cookie

多次請求的資料儲存在cookie中

如何使用

在不考慮水準擴充,并且有事務需要的場景中,使用有狀态服務。

需要伸縮擴充,可以用無狀态服務,無狀态服務實作事務,可以使用例如session,隐藏表單等手段完成事務的實作。

繼續閱讀