其實,關於這兩個詞語,咱們常常聽到,網上也有不少文章介紹,你們能夠自行搜索。這裏只談一談我的對它們的理解。html
下面分別從編程語言和系統架構的角度聊一聊stateless和stateful。web
首先,咱們看一個Java API的例子:redis
Java的SDK提供了兩種遍歷List的方式,一種是使用foreach;一種是使用iterator,以下:編程
List<String> list = new ArrayList<String>(); for(int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); }
List<String> list = new ArrayList<String>(); Iterator<String> iterator = list.iterator(); while(iterator.hasNext()) { System.out.println(iterator.next()); }
第一種方式是調用list.get(i),這個api就是stateless的,由於get方法的實現不會保存一個「狀態」,屢次調用都是返回同一個元素。api
第二種方式是調用iterator.next(),這個api就是stateful的,由於next方法的實現會保存一個「狀態」:遊標信息,先後兩次調用返回不一樣元素。服務器
接下來,從向對象編程(OOP:object orentied programming)和函數式編程(FP:functional programming)角度聊一聊stateless和stateful。網絡
面向對象編程裏面的方法/函數叫作method;函數式編程裏面的方法/函數叫作function。session
函數並不必定都是stateless的,只有純函數(PF:pure function)纔是stateless。純函數的特徵就是其返回只跟函數的輸入參數有關,不依賴於其它的state。架構
其實不論是method,仍是function,只要是符合純函數特徵,都是stateless。併發
stateless方法/函數的優勢是,在併發環境下,不會因爲state的變化致使side effect。
首先,從網絡協議角度來看,http協議是stateless的,tcp協議是stateful的,ip協議是stateless的。雖說,http協議自己是stateless的,可是不少web 應用倒是stateful的,由於web應用保存了用戶的session信息,這樣對登錄以前和登錄以後用戶請求的處理是不一樣的。可是,對於不少web api service來說,可能就是stateless的,由於其不須要用戶登錄,而只須要用戶提供驗證的credentials,對屢次請求的處理邏輯是同樣的。
對於系統內部,負責權限驗證部分的component,若是把session信息存放在內存,則它是stateful的;若是放在standalone的session store(好比:redis)裏面,則它是stateless的。當這個component是stateless時,其能夠很容易的實現水平擴展,就不須要考慮sticky session等問題。
如今很流行一個詞serverless(無服務),相比於serverful,其核心思想就是」不須要一直霸佔一個server來保持running「,而是經過事件來觸發,接收到事件時,纔開始分配服務器資源並啓動定義好的function,執行完function,就回收服務器資源,整個過程就像程序運行過程當中調用一個函數,因此這樣一個function自己是stateless的。能夠看到,serverless可以充分利用服務器資源,由於function執行完就會釋放掉,可是,它有一個顯著問題就是」冷啓動「,由於不像serverful的應用,代碼只須要第一次啓動的時候加載完成便可;serverless的應用,每次事件觸發執行function,都須要加載。
如今不少cloud平臺都有推出serverless功能,但最先的應該是AWS lambda。