怎麼理解和設計應用的無狀態化?
什麼是無狀態?
無狀態(statelessness)指的是服務內部變數值的儲存。這句話怎麼理解?我們可以理解為在我們的伺服器內部儲存一個變數。
一個請求過來,那麼此時帶著該變數的就為有狀態,或者在客戶端儲存了該變數,請求過來時,需要重複使用該變數的也是有狀態的體現。
那麼我們怎麼做,可以讓我們的應用軟體是無狀態。那麼我們需要將該變數儲存在
第三方的一些服務或者中介軟體上,比如將使用者登陸token儲存在redis上。
這樣將有狀態的資訊隔離在了第三方服務上,從而保證我們自己的應用本身無狀態化。
判斷是不是無狀態?
1. 發起兩個相同的請求a,b
2. 檢視請求的上下文資訊
3. a請求預設使用b請求資訊 則為有狀態
4. a請求沒有使用到b請求的資訊,則為呼叫了其他伺服器或者中介軟體所儲存的公共資訊, 則為無狀態。
無狀態的場景使用
WEB伺服器
請求和請求本身之間是是無狀態的。
伺服器模組本身
是無狀態的。特定版本的模組只會存在一個例項。我們不會例項化軟體模組,
儘管我們需要例項化軟體模組中的類,這些類會保持狀態,
但是模組本身不會這樣做。符合這部分定義的軟體實體樣例包括WAR、EAR以及JAR檔案。
有狀態的場景和使用
CAS伺服器
請求推客戶端cookie TGC的形式存在.
下一次請求會帶著這個cookie進行與CAS認證服務內TGT授權和校驗服務進行互動,以維護上下文關係。
MSN QQ 微信 網路遊戲等伺服器
這種存在即時性通訊的服務,會維護每個連結的狀態,通過請求來維護或者管理或者重現這種上下文關係。
對比無狀態和有狀態
有狀態:服務間資料需要同步 主從同步 副本同步等 擴容複雜 雙機熱備等 宕機容易丟失資料
無狀態:服務間資料不需要同步 擴容快速 熱備冷備切換容易 容易水平擴充套件。
怎麼做到應用無狀態化?
a. 通過配置管理中心 進行配置檔案的有狀態化 驅動應用的無狀態化。
b. 通過第三方軟體服務進行儲存處理、叢集、擴容等手段,來保證所應用的隔離達到應用的無狀態化。
c. 通過自己設計第三方的隔離服務,整合所需要無狀態化的應用服務。