iT邦幫忙

2

淺談無狀態這件事 Stateless

無狀態stateless指的是web客戶端在發送請求時,到底需不需要一直帶著驗證資訊,或者是所謂的上下文。這影響到響應的服務器是否需要為同一台。若響應的服務器為不同台時,請求又剛好是需要上下文,則會出現需要重複提交驗證的環節。這時若請求不需要上下文,則即便請求發給不同台服務器也能處理,這就是無狀態的表現。

甚麼時候會需要使用無狀態呢?就是要實行水平擴展。流量一多,做了負載均衡,則服務的主機就會輪替、交互提供服務。

但無狀態只是一個概念,有多種實現的方法,其實跟解偶類似。解偶是讓服務獨立不相依,恰恰符合了無狀態的獨立不相依。

具體實現無狀態的方法有:
一、每次請求都帶有完整的驗證資訊在cookie中,但不建議,因為cookie是儲存在客戶端,容易被看到,甚至破解。若遇到有心人,可能有資訊暴露及DDos的風險。
二、將狀態存在服務器的session中,讓客戶端的cookie只存放sessionid,而session內容則存在資料庫。django默認的儲存方式好像就是資料庫,所以理論上用django做的API服務器是可以直接水平擴展的,任一台服務器在辨識請求時,只要看傳入的sessionid並比對同一張session儲存表即可獲得客戶端的狀態
三、單獨創建一個session服務器,並且將它擴展多台。但理論上用django的session中間件,就可看作一個獨立的session服務器,換句話說,十台django web服務器、就有十個session服務器。乍看下沒有解偶,但這時解偶不重要,因為session與api都在同一個容器內運行,不管哪一個負荷大了都一樣是換一個容器負載。

以上理論待實作驗證


尚未有邦友留言

立即登入留言