MVC 架構
- MVC
前端: View 層
后端: Control 層 && Model 層
Serverless 解決問題的邊界,就是服務端的邊界,即服務端運維。
Serverless
-
狹義 Serverless(最常見)= Serverless computing 架構 = FaaS 架構 = Trigger(事件驅動)+ FaaS(函數即服務)+ BaaS(后端即服務,持久化或第三方服務)= FaaS + BaaS
- 基於 Serverless 架構,我們完全可以把傳統的 MVC 架構轉換為 BaaS+View+FaaS 的組合,重構或實現。
-
廣義 Serverless = 服務端免運維 = 具備 Serverless 特性的雲服務
FaaS 與應用托管 PaaS 平台對比,最大的區別在於資源利用率,這也是 FaaS 最大的創新點。FaaS 的應用實例可以縮容到 0,而應用托管 PaaS 平台則至少要維持 1 台服務器或容器。
FAAS 冷啟動
冷啟動本來是 PC 上的概念,它是指關閉電源后,PC 再啟動仍然需要重新加載 BIOS 表,也就是從硬件驅動開始啟動,因此啟動速度很慢。
FaaS 中的冷啟動是指從調用函數開始到函數實例准備完成的整個過程。 冷啟動我們關注的是啟動時間,啟動時間越短,我們對資源的利用率就越高。現在的雲服務商,基於不同的語言特性,冷啟動平均耗時基本在 100~700 毫秒之間。得益於 Google 的 JavaScript 引擎 Just In Time 特性,Node.js 在冷啟動方面速度是最快的。
請求第一次訪問時,雲服務商就可以利用構建好的緩存鏡像,直接跳過冷啟動的下載函數代碼步驟,從鏡像啟動容器,這個也叫預熱冷啟動。所以如果我們有些業務場景對響應時間比較敏感,我們就可以通過預熱冷啟動或預留實例策略,加速或繞過冷啟動時間。
FAAS 分層
- 容器
- 運行時runtime
- 具體函數代碼
雲服務商負責的就是容器和 Runtime 的准備階段了。而開發者自己負責的則是函數執行階段。一旦容器 &Runtime 啟動后,就會維持一段時間,這段時間內的這個函數實例就可以直接處理用戶數據請求。當一段時間內沒有用戶請求事件發生(各個雲服務商維持實例的時間和策略不同),則會銷毀這個函數實例。
FAAS 進程模型
- 用完即毀型:函數實例准備好后,執行完函數就直接結束。這是 FaaS 最純正的用法。
- 常駐進程型:函數實例准備好后,執行完函數不結束,而是返回繼續等待下一次函數被調用。這里需要注意,即使 FaaS 是常駐進程型,如果一段時間沒有事件觸發,函數實例還是會被雲服務商銷毀。
SFF(Serverless For Frontend)指前端數據請求過來,函數觸發器觸發我們的函數服務;我們的函數啟動后,調用后端提供的元數據接口,並將返回的元數據加工成前端需要的數據格式;我們的 FaaS 函數完全就可以休息了。
Serverless 示例
百度雲 Serverless 服務 CFC:
選擇 HTTP 觸發器;返回當前系統時間:
➜ ~ curl https://7m2mvhhnp7v6y.cfc-execute.bj.baidubce.com/galvin
Hello World
2020-05-08 02:32:38%
后端應用 BaaS 化
回到我們的進程模型,用完即毀型是天然的 Stateless,因為它執行完就銷毀,你無法單純用它持久化存儲任何值;常駐進程型則是天然的 Stateful,因為它的主進程不退出,主進程可以存儲部分值。
BaaS 化的核心思想就是將后端應用轉換成 NoOps 的數據接口,這樣 FaaS 在 SFF 層就可以放開手腳,而不用再考慮冷啟動時間了。
AWS 提供的 DynamoDB 服務或 Aurora 服務。數據庫就是 BaaS 化的,我們無需關心服務端運維,也無需關心 IP,我們只要通過域名和密鑰訪問我們的 DB,就像使用數據編排一樣
總結
- 擴縮容我們可以選擇縱向擴縮容和橫向擴縮容,縱向擴縮容就是提升單機性能,價格上升曲線陡峭,我們通常要慎重選擇;橫向擴縮容就是提升機器數量,價格上升平穩,也是我們常用的默認擴縮容方式。
- 在網絡拓撲圖中,Stateful 是存數據的節點;Stateless 是處理數據的節點,不負責保存數據。只有 Stateless 節點才能任意擴縮容,Stateful 節點因為是保存我們的重要數據,所以我們要謹慎對待。如果我們的網絡拓撲節點想自由擴縮容,則需要將這個節點的數據操作外移到專門的 Stateful 節點。
- 我們的 FaaS 訪問 Stateful 節點,那我們就希望 Stateful 節點對 FaaS 提供數據接口,而不是單純的數據庫指令,因為數據庫連接會增加 FaaS 的額外開支。另外為了方便后端工程師開發,我們需要將 Stateful 節點 BaaS 化,BaaS 化的內容,我們將在后續的課程中展開。
A Berkeley View onServerless Computing
https://www2.eecs.berkeley.edu/Pubs/TechRpts/2019/EECS-2019-3.pdf