从零入门 Serverless | 一文搞懂函数计算及其工作原理
作者 | 孔德慧(夏莞)? 阿里云函數(shù)計算開發(fā)工程師
本文整理自《Serverless 技術(shù)公開課》,關(guān)注“Serverless”公眾號,回復(fù)“入門”,即可獲取 Serverless 系列文章 PPT。
什么是函數(shù)計算?
大家都了解,Serverless 并不是沒有服務(wù)器,而是開發(fā)者不再需要關(guān)心服務(wù)器。下圖是一個應(yīng)用從開發(fā)到上線的對比圖:
在傳統(tǒng) Serverful 架構(gòu)下,部署一個應(yīng)用需要購買服務(wù)器,部署操作系統(tǒng),搭建開發(fā)環(huán)境,編寫代碼,構(gòu)建應(yīng)用,部署應(yīng)用,配置負(fù)載均衡機(jī)制,搭建日志分析與監(jiān)控系統(tǒng),應(yīng)用上線后,繼續(xù)監(jiān)控應(yīng)用的運行情況。而在 Serverless 架構(gòu)下,開發(fā)者只需要關(guān)注應(yīng)用的開發(fā)構(gòu)建和部署,無需關(guān)心服務(wù)器相關(guān)操作與運維,在函數(shù)計算架構(gòu)下,開發(fā)者只需要編寫業(yè)務(wù)代碼并監(jiān)控業(yè)務(wù)運行情況。這將開發(fā)者從繁重的運維工作中解放出來,把精力投入到更有意義的業(yè)務(wù)開發(fā)上。
上圖展示了函數(shù)計算的使用方式。從用戶角度,他需要做的只是編碼,然后把代碼上傳到函數(shù)計算中。上傳代碼就意味著應(yīng)用部署。當(dāng)有高并發(fā)請求涌入時,開發(fā)者也無需手動擴(kuò)容,函數(shù)計算會根據(jù)請求量毫秒級自動擴(kuò)容,彈性可靠地運行任務(wù),并內(nèi)置日志查詢、性能監(jiān)控、報警等功能幫助開發(fā)者發(fā)現(xiàn)問題并定位問題。
函數(shù)計算核心優(yōu)勢
1. 敏捷開發(fā)
- 使用函數(shù)計算時,用戶只需聚焦于業(yè)務(wù)邏輯的開發(fā),編寫最重要的 “核心代碼”;
- 不再需要關(guān)心服務(wù)器購買、負(fù)載均衡、自動伸縮等運維操作;
- 極大地降低了服務(wù)搭建的復(fù)雜性,有效提升開發(fā)和迭代的速度。
2. 彈性擴(kuò)容
- 函數(shù)計算根據(jù)請求量自動進(jìn)行彈性擴(kuò)容,無需任何手動配置;
- 毫秒級調(diào)度計算資源,輕松應(yīng)對業(yè)務(wù)洪峰。
3. 穩(wěn)定高可用
- 函數(shù)計算分布式集群化部署,支持多可用區(qū);
- 如果某個可用區(qū)因自然災(zāi)害或電力故障導(dǎo)致癱瘓,函數(shù)計算會迅速切換到同區(qū)域其他可用區(qū)的基礎(chǔ)設(shè)施運行函數(shù),確保服務(wù)高可用。
4. 有競爭力的成本
- 函數(shù)計算提供了豐富的計量模式,幫助您在不同場景獲得顯著成本優(yōu)勢;
- 后付費模型按實際使用計算資源計費,不占用計算資源則不計費,資源利用率高達(dá) 100% ;
- 預(yù)付費模型根據(jù)業(yè)務(wù)負(fù)載估算提前預(yù)購計算力,單價更低,組合使用后付費和預(yù)付費方式將有效降低成本。
函數(shù)計算使用場景
從使用場景來說,主要有三類:
-
**Web 應(yīng)用:**可以是各種語言寫的,這種可以是使用 Serverless 框架新編寫的程序,也可以是已有的應(yīng)用。比如可能是小程序后端,也可能是 Web API;
-
**對計算能力有很強(qiáng)的彈性訴求的應(yīng)用:**比如 AI 推理、音視頻處理、圖文轉(zhuǎn)換等;
-
**事件驅(qū)動型的應(yīng)用:**比如通過其他阿里云產(chǎn)品驅(qū)動的場景,Web Hook、定時任務(wù)等。
函數(shù)計算已經(jīng)與很多產(chǎn)品進(jìn)行了打通,比如對象存儲、表格存儲、定時器、CDN、日志服務(wù)、云監(jiān)控等十幾個產(chǎn)品,可以非常快速地組裝出一些業(yè)務(wù)邏輯。
函數(shù)計算工作原理
1. 函數(shù)計算調(diào)用鏈路
上圖展示了函數(shù)計算完整的請求和調(diào)用鏈路。函數(shù)計算是事件驅(qū)動的無服務(wù)器應(yīng)用,事件驅(qū)動是說可以通過事件源自動觸發(fā)函數(shù)執(zhí)行,比如當(dāng)有對象上傳至 OSS 中時,自動觸發(fā)函數(shù),對新上傳的圖片進(jìn)行處理。函數(shù)計算支持豐富的事件源類型,包括日志服務(wù)、對象存儲、表格存儲、消息服務(wù)、API 網(wǎng)關(guān)、CDN 等。
除了事件觸發(fā)外,也可以直接通過 API/SDK 直接調(diào)用函數(shù)。調(diào)用可以分為同步調(diào)用與異步調(diào)用,當(dāng)請求到達(dá)函數(shù)計算后,函數(shù)計算會為請求分配執(zhí)行環(huán)境,如果是異步調(diào)用,函數(shù)計算會將請求事件存入隊列中,等待消費。
2. 函數(shù)計算調(diào)用方式
同步調(diào)用的特性是,客戶端期待服務(wù)端立即返回計算結(jié)果。請求到達(dá)函數(shù)計算時,會立即分配執(zhí)行環(huán)境執(zhí)行函數(shù)。
以 API 網(wǎng)關(guān)為例,API 網(wǎng)關(guān)同步觸發(fā)函數(shù)計算,客戶端會一直等待服務(wù)端的執(zhí)行結(jié)果,如果執(zhí)行過程中遇到錯誤, 函數(shù)計算會將錯誤直接返回,而不會對錯誤進(jìn)行重試。這種情況下,需要客戶端添加重試機(jī)制來做錯誤處理。
異步調(diào)用的特性是,客戶端不急于立即知道函數(shù)結(jié)果,函數(shù)計算將請求丟入隊列中即可返回成功,而不會等待到函數(shù)調(diào)用結(jié)束。
函數(shù)計算會逐漸消費隊列中的請求,分配執(zhí)行環(huán)境,執(zhí)行函數(shù)。如果執(zhí)行過程中遇到錯誤,函數(shù)計算會對錯誤的請求進(jìn)行重試,對函數(shù)錯誤重試三次,系統(tǒng)錯誤會以指數(shù)退避方式無限重試,直至成功。
異步調(diào)用適用于數(shù)據(jù)的處理,比如 OSS 觸發(fā)器觸發(fā)函數(shù)處理音視頻,日志觸發(fā)器觸發(fā)函數(shù)清洗日志,都是對延時不敏感,又需要盡可能保證任務(wù)執(zhí)行成功的場景。如果用戶需要了解失敗的請求并對請求做自定義處理,可以使用 Destination 功能。
3. 函數(shù)計算執(zhí)行過程
函數(shù)計算是 Serverless 的,這不是說無服務(wù)器,而是開發(fā)者無需關(guān)心服務(wù)器,函數(shù)計算會為開發(fā)者分配實例執(zhí)行函數(shù)。
如上圖所示,當(dāng)函數(shù)第一次被調(diào)用的時候,函數(shù)計算需要動態(tài)調(diào)度實例、下載代碼、解壓代碼、啟動實例,得到一個可執(zhí)行函數(shù)的代碼環(huán)境。然后才開始在系統(tǒng)分配的實例中真正地執(zhí)行用戶的初始化函數(shù),執(zhí)行函數(shù)業(yè)務(wù)邏輯。這個調(diào)度實例啟動實例的過程,就是系統(tǒng)的冷啟動過程。
函數(shù)邏輯執(zhí)行結(jié)束后,不會立即釋放掉實例,會等一段時間,如果在這段時間內(nèi)有新的調(diào)用,會復(fù)用這個實例,比如上圖中的 Request 2,由于執(zhí)行環(huán)境已經(jīng)分配好了,Request 2 可以直接使用,所以 Request 2 就不會遇到冷啟動。
Request 2 執(zhí)行結(jié)束后,等待一段時間,如果這段時間沒有新的請求分配到這個實例上,那系統(tǒng)會回收實例,釋放執(zhí)行環(huán)境。此實例釋放后,新的請求 Request 3 來到函數(shù)計算,需要重新調(diào)度實例、下載代碼、解壓代碼,啟動實例,又會遇到冷啟動。
所以,為了減小冷啟動帶來的影響,要盡可能避免冷啟動,降低冷啟動帶來的延時。
使用預(yù)留實例可以完全避免冷啟動,預(yù)留實例是在用戶預(yù)留后就分配實例,準(zhǔn)備執(zhí)行環(huán)境;請求結(jié)束后系統(tǒng)也不會自動回收實例。
預(yù)留實例不由系統(tǒng)自動分配與回收,由用戶控制實例的生命周期,可以長駐不銷毀,這將徹底消除實例冷啟動帶來的延時毛刺,提供極致性能,也為在線應(yīng)用遷移至函數(shù)計算掃清障礙。
如果業(yè)務(wù)場景不適合使用預(yù)留實例,那就要設(shè)法降低冷啟動的延時,比如降低代碼包大小,可以降低下載代碼包、解壓代碼包的時間。Initializer 函數(shù)是實例的初始化函數(shù),Initializer 在同一實例中執(zhí)行且只執(zhí)行一次,所以可以將一些耗時的公共邏輯放到 Initializer 中,比如在 NAS 中加載依賴、建立連接等等。另外要盡量保持請求連續(xù)穩(wěn)定,避免突發(fā)的流量,由于系統(tǒng)已啟動的實例不足以支撐大量的突發(fā)流量,就會帶來不可避免的冷啟動。
課程推薦
為了更多開發(fā)者能夠享受到 Serverless 帶來的紅利,這一次,我們集結(jié)了 10+ 位阿里巴巴 Serverless 領(lǐng)域技術(shù)專家,打造出最適合開發(fā)者入門的 Serverless 公開課,讓你即學(xué)即用,輕松擁抱云計算的新范式——Serverless。
點擊即可免費觀看課程:https://developer.aliyun.com/learning/roadmap/serverless
更多詳情請關(guān)注 Serverless 。Serverless 公眾號,關(guān)注 Serverless 技術(shù)趨勢,更關(guān)注你在落地實踐中遇到的問題。
總結(jié)
以上是生活随笔為你收集整理的从零入门 Serverless | 一文搞懂函数计算及其工作原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里高级技术专家:如何结构化地思考、做事
- 下一篇: 从零入门 Serverless | 一文