聊一聊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的冷啟動,
另一種是常駐記憶體,對應函式實體可復用的熱啟動(串行),
常駐不是永久,如果一段時間內沒有事件觸發,函式實體還是會被銷毀的,
熱啟動雖然在一定程度上可以提高請求處理效率和應用性能,但某些情況下也要特別注意,熱啟動可能不是我們想要的,
在某些涉及時間的場景,我們需要將時間的生成放在入口函式中用以保證每次函式執行后時間重新計算,如果這部分代碼放在入口函式之外,那么在最初冷啟動后,熱啟動使用的一直就是舊的時間,且不會更新,
請求回應鏈路
解釋完冷啟動后,再來看一下完整的請求回應鏈路,

- 用戶發起請求,觸發器接收
- 事件驅動,觸發器通知函式服務處理http請求
- 函式服務進行函式實體檢查,有則呼叫,沒有則從函式代碼倉庫拉取后創建再呼叫
- 函式將處理完的結果交給觸發器
- 觸發器將其回應到客戶端用戶
- 一段時間內若無事件觸發,FaaS應用縮容至0
函式實體
每一個函式實體背后都是一個容器,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 架構
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/260553.html
標籤:其他
下一篇:Scrapy簡介
