今天我們來談一談服務的狀態(tài),服務的狀態(tài)指的是請求是否與不同的服務實例相關。分為兩種,有狀態(tài)和無狀態(tài)。
無狀態(tài)服務重要特征是同一個輸入對于每個服務實例都會有確定的相同的輸出,它要求服務要么是沒有存數(shù)據(jù)只有算法,要么是所有節(jié)點的數(shù)據(jù)均相同。
舉個例子,例如電商系統(tǒng)有多個服務實例,用戶登陸認證后,向購物車中加入商品和查詢購物車中有哪些商品,對于這兩個操作無論分配到那個具體的服務實例,都可以保證得到的數(shù)據(jù)是一致的。
無狀態(tài)服務的優(yōu)點?
方便橫向擴展,運維簡單,可以很容易地增減節(jié)點
如何實現(xiàn)無狀態(tài)服務?
1 服務不保存數(shù)據(jù),服務只提供算法和邏輯,那么自然就不會有狀態(tài),例如有個壓縮文件的服務,他有多個實例,無論調(diào)用那個實例我們均可以得到壓縮的結果。
2 服務保存請求相關的數(shù)據(jù),同時這些數(shù)據(jù)在所有節(jié)點均相同,一般是通過引入第三方的存儲,多個服務實例,依賴同一個第三方服務。這樣也可以實現(xiàn)服務的無狀態(tài)。
有狀態(tài)的服務更加的常見,同一服務的不同實例所擁有的數(shù)據(jù)不一樣,同樣說到登陸這個場景,有狀態(tài)的服務是這樣的,用戶一的登陸狀態(tài)可能只保存在服務A中,當請求分配到服務B時,用戶是未登陸的狀態(tài)。那么有狀態(tài)的服務就必須要保證,每個請求都能準確的落到擁有它狀態(tài)的那個節(jié)點上。常用的做法用一致性hash算法,來實現(xiàn)請求的分配。
有狀態(tài)服務的優(yōu)點
1 本地保存著數(shù)據(jù),在處理時會減少網(wǎng)絡開銷。
2 模型簡單,可用性和一致性容易保證。
有狀態(tài)服務如何保證請求落到同一實例上?
1 簡單的hash取模,或者一致性hash
2 長連接
有狀態(tài)與無狀態(tài)最本質(zhì)的區(qū)別在于,節(jié)點的數(shù)據(jù)是否是全量數(shù)據(jù),無狀態(tài)的服務每個節(jié)點的數(shù)據(jù)均是全量。有狀態(tài)的服務則不是。