聊一聊Serverless
聊一聊Serverless
- Serverless是什么
- 云計算發展過程
- Serverless的優勢
- Serverless的不足
- 云函數
- 冷啟動
- 熱啟動
- 函數實例
- 不同語言冷啟動時長排名
- 首次調用超時
- 性能優化
- SFF
- BaaS
- 再會
- 推薦閱讀
Serverless是什么
從單詞角度理解,server譯為服務,less譯為少,Serverless可以理解為無服務或輕服務。
從語義角度理解,之所以叫輕服務,是因為和傳統的PaaS(平臺即服務)相比,用戶不需要關心服務器的部署與配置。但這并不意味著不需要服務器,只是這些東西皆由云平臺來提供。
從架構角度理解,Serverless=FaaS+事件驅動+BaaS=無服務器計算(Serverless computing)
- Faas:Function as a Service,函數即服務
- 事件驅動:通過事件觸發的形式去完成函數的調用,處理請求和響應(如定時任務/http請求…)
- Baas:Backend as a Service 后端即服務
云計算發展過程
下圖為云計算發展的整個過程,同時也是Serverless的發展過程,共分為四個階段。
物理機階段:此時如果進行一個網站的開發是極為麻煩的,不僅需要購置物理機,還要手動安裝各種運行環境,開發,部署,測試,上線。除此之外,還要在物理層面上解決電,網,硬件磨損等各種問題。
IaaS階段:IaaS指的是基礎設施即服務。隨著虛擬化技術的不斷發展,出現了很多基于虛擬化的云廠商和產品,如阿里云ESC。這個階段,無需自建機房,采購以及配置硬件設施,云平臺會提供這些基礎設施。也正因如此,那些物理層面的電,硬件磨損什么的,用戶無需關注。
PaaS階段:PaaS指的是平臺即服務。所謂的平臺,其實是結合業務發展,在IaaS基礎上,將一些如數據庫,中間件等通用功能做成服務。虛擬化技術可以讓用戶不必關心硬件問題,后來出現的容器技術可以讓用戶不必關心運行環境差異的問題。容器技術出現后,意味著服務器上部署的不再是應用,而是容器。當容器多了后,可通過k8s進行管理。
Serverless階段:這個階段是真正解放生產,專注業務的階段。在FaaS層面,應用由諸多個獨立的函數組成,每個函數實現各自的業務邏輯。在數據獲取層面,BaaS 將后端能力封裝成了服務,并以接口的形式提供給FaaS。事實上,數據庫的增刪改查剛好對應Restful API的POST/DELETE/PUT/GET。
Serverless的優勢
專注業務,快速迭代
首先,云平臺從開發人員手中接過服務部署,配置等運維工作,開發人員壓力減小,只需關注業務開發本身即可。其次,傳統開發模式下,一個完整的開發流程需要經過前后端并行開發,后端部署,聯調測試,上線等過程,比較繁雜。而Serverless可以讓前端人員跨過server直接和數據庫交互(FaaS+BaaS),極大地簡化了開發流程。
節省維護和運營成本
服務提供方無需在業務上線前預估資源,也無需單獨購置服務器。Serverless會根據實際請求數量進行自動擴縮容,實行按需計費。在空閑情況下,憑借短時間內完成冷啟動的優勢,Serverless可以縮容的極致為0,即無任何計算消耗,這也是PaaS做不到的。從這點上考慮,那些每天大部分時間都沒有流量或者有很少流量的應用是極為適合Serverless落地的。
Serverless的不足
狀態管理能力弱(針對FaaS)
為了保證可以自動擴縮容,FaaS應用就必須是無狀態的。有狀態的服務就要考慮數據的存儲,需要BaaS的支持。
調試困難
本地環境和云環境始終是有區別的,有些報錯信息只能在云環境查看,而且某些問題不太容易定位是本地環境還是云環境的產生的。
云函數
定義
云函數可以看作是Serverless的產品之一,每一個函數都可以看作是一個服務。
與此同時,云函數也具備FaaS能力,是FaaS模式的具體實現。
觸發器
觸發器用于觸發某一類事件,不同云平臺支持的觸發器類型也可能不同,但基本上每個云平臺都會包含HTTP觸發器和定時觸發器兩大類型。
HTTP觸發器對于客戶端而言,就是一個可訪問的數據接口。
定時任務類型的觸發器,會在指定時間周期內執行某一任務。
為限制頻繁調用,幾乎所有云平臺都會對定時的時間粒度進行限制,如最小一分鐘。
體驗
- doc
- scf
冷啟動
定義
在Serverless computing世界中,函數是按需運行的,如果沒有請求,就不會有函數實例占用函數服務資源。這種僅在必要時運行函數的整個執行過程,被稱為冷啟動。
下圖為冷啟動包含的階段以及云廠商和開發者各自所負責的部分。
- 下載代碼: FaaS 平臺本身不會存儲代碼,這也是為了能夠縮容到0。上傳或自己編寫的代碼實際上會被放在存儲服務中,在冷啟動過程中會從存儲服務中獲取函數代碼后下載。
- 啟動容器: 代碼下載完成后,FaaS 會根據函數的配置,啟動對應容器。也正是通過容器技術,FaaS 可保證每個函數的獨立性。
- 初始化運行環境: 分析代碼依賴、執行用戶初始化邏輯、初始化入口函數之外的代碼等。
- 運行代碼: 調用入口函數執行代碼。這個階段比較特別,可能是冷啟動,也可能是熱啟動。
熱啟動
FaaS有兩種模式,一種是用完即毀,對應從0到1的冷啟動。
另一種是常駐內存,對應函數實例可復用的熱啟動(串行)。
常駐不是永久,如果一段時間內沒有事件觸發,函數實例還是會被銷毀的。
熱啟動雖然在一定程度上可以提高請求處理效率和應用性能,但某些情況下也要特別注意,熱啟動可能不是我們想要的。
在某些涉及時間的場景,我們需要將時間的生成放在入口函數中用以保證每次函數執行后時間重新計算。如果這部分代碼放在入口函數之外,那么在最初冷啟動后,熱啟動使用的一直就是舊的時間,且不會更新。
請求響應鏈路
解釋完冷啟動后,再來看一下完整的請求響應鏈路。
函數實例
每一個函數實例背后都是一個容器。FaaS 通過容器來隔離每個函數實例,保證函數的獨立性。
如下圖所示,容器內最主要的是運行環境,包含編程語言,內置模塊,FaaS 內置依賴和函數代碼。
- 編程語言:創建FaaS應用所指定的語言,如Node
- 內置模塊:所選編程語言的內置模塊,如fs之于Node
- FaaS 內置依賴:FaaS平臺為便于開發者開發提供的某些默認依賴
- 函數代碼:自己編寫的代碼
不同語言冷啟動時長排名
不同語言的冷啟動時長是有差異的,下圖為不同語言的冷啟動時長排名。
橫坐標為分配的內存空間,縱坐標為平均冷啟動時長,單位ms
從上圖我們可以看到兩個關鍵信息:
- 分配的內存空間越大,冷啟動時長越短
- Nodejs冷啟動時間是最短的
首次調用超時
- 冷啟動快慢時長差距還是很明顯的,從毫秒級到秒級甚至分鐘級皆有可能。
- 對于Node這種能夠短時間內完成冷啟動的語言來說,一定程度上就是FaaS應用敢縮容到0的底氣。
- 但是像java這種冷啟動時間比較久的語言,就有可能出現首次調用超時的問題。
性能優化
Serverless性能瓶頸主要在冷啟動耗時上,所以性能優化也是從這方面入手。
預熱:其本質是將冷啟動提前。使用熱啟動的方式對要執行的函數進行提前觸發,用以完成耗時的冷啟動過程。這樣在某個流量峰值,運行的代碼就都是熱啟動的形式,處理效率和應用性能提高。
減小代碼體積: 函數應用實例收縮到0后,當有新的請求到來,需要下載代碼。如果代碼體積太大,這個過程就會十分耗時。通過壓縮,按需引入等方式對代碼進行精簡,可減少冷啟動耗時。
提高并發配額: 默認情況下一個函數實例只能處理一個請求,但可通過提高并發配額進而提高函數的處理能力。如額度為3,則一個函數實例現在可處理三個請求,相比之前少了兩次冷啟動的過程。 并發限制數量取決于分配的內存大小,對于騰訊云來說,128內存下,最大并發為900。
選擇冷啟動耗時少的語言 : 如node,python
SFF
BFF(Backend For Frontend)和SFF(Serverless For Frontend)解決的是同一個問題,作為前后端數據通信的中間層,把后端返回的不符合前端預期的元數據轉成前端預期的數據格式。
出現這種非預期格式的元數據,大多是微服務導致的(一個后端接口數據來自多個后端應用)。
相比BFF,SFF用完即毀的特點體現的更明顯:請求-轉換-響應-空閑-縮容為0。
從這點考慮Serverless也適合用于中間層數據處理。
BaaS
FaaS適用于那些無狀態場景,而涉及數據存儲等有狀態的場景,就需要BaaS的支持。
舉個例子,計算PV(page view).
let pv = 0;function handler(event) {pv++;return pv;}對于FaaS來說,這種統計其實并不精準。如果一段時間沒有新的事件觸發,函數執行完后,它的運行環境就會被銷毀,函數實例收縮為0。當下一次請求過來時,函數應用會創建一個新的實例,該實例會初始化一個新的運行環境,之前的狀態不會被保留。
這種情況下,就需要BaaS的配合了。BaaS服務于FaaS ,可以讓FaaS通過接口調用形式來使用 BaaS,完成存儲數據,比如阿里云的表格存儲(相當于一個NoSQL數據庫)。
const tablestore = require('tablestore');async function handler(event) {let pv = await tablestore.get();pv += 1;await tablestore.save(pv);return pv;}這樣入庫后,即使FaaS應用收縮為0,統計數據也不會受到影響。
再會
情如風雪無常,
卻是一動既殤。
感謝你這么好看還來閱讀我的文章,
我是冷月心,下期再見。
推薦閱讀
- 結合阿里云 FC 談談我對 FaaS 的理解
- AWS Lambda 最新編程語言冷啟動時間測試:Node.js 性能最高
- Serverless入門課
- 玩轉 Serverless 架構
總結
以上是生活随笔為你收集整理的聊一聊Serverless的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 东华oj1-求长方形的面积和周长C++
- 下一篇: 由浅入深laravel教程第1课:搭建h