函数计算是如何工作的?
函數(shù)計算調(diào)用鏈路
上圖展示了函數(shù)計算完整的請求和調(diào)用鏈路。函數(shù)計算是事件驅(qū)動的無服務器應用,事件驅(qū)動是說可以通過事件源自動觸發(fā)函數(shù)執(zhí)行,比如當有對象上傳至 OSS 中時,自動觸發(fā)函數(shù),對新上傳的圖片進行處理。函數(shù)計算支持豐富的事件源類型,包括日志服務、對象存儲、表格存儲、消息服務、API 網(wǎng)關、CDN 等。
除了事件觸發(fā)外,也可以直接通過 API/SDK 直接調(diào)用函數(shù)。調(diào)用可以分為同步調(diào)用與異步調(diào)用,當請求到達函數(shù)計算后,函數(shù)計算會為請求分配執(zhí)行環(huán)境,如果是異步調(diào)用,函數(shù)計算會將請求事件存入隊列中,等待消費。
函數(shù)計算調(diào)用方式
同步調(diào)用的特性是,客戶端期待服務端立即返回計算結(jié)果。請求到達函數(shù)計算時,會立即分配執(zhí)行環(huán)境執(zhí)行函數(shù)。
以 API 網(wǎng)關為例,API 網(wǎng)關同步觸發(fā)函數(shù)計算,客戶端會一直等待服務端的執(zhí)行結(jié)果,如果執(zhí)行過程中遇到錯誤, 函數(shù)計算會將錯誤直接返回,而不會對錯誤進行重試。這種情況下,需要客戶端添加重試機制來做錯誤處理。
異步調(diào)用的特性是,客戶端不急于立即知道函數(shù)結(jié)果,函數(shù)計算將請求丟入隊列中即可返回成功,而不會等待到函數(shù)調(diào)用結(jié)束。
函數(shù)計算會逐漸消費隊列中的請求,分配執(zhí)行環(huán)境,執(zhí)行函數(shù)。如果執(zhí)行過程中遇到錯誤,函數(shù)計算會對錯誤的請求進行重試,對函數(shù)錯誤重試三次,系統(tǒng)錯誤會以指數(shù)退避方式無限重試,直至成功。
異步調(diào)用適用于數(shù)據(jù)的處理,比如 OSS 觸發(fā)器觸發(fā)函數(shù)處理音視頻,日志觸發(fā)器觸發(fā)函數(shù)清洗日志,都是對延時不敏感,又需要盡可能保證任務執(zhí)行成功的場景。如果用戶需要了解失敗的請求并對請求做自定義處理,可以使用 Destination 功能。
函數(shù)計算執(zhí)行過程
函數(shù)計算是 Serverless 的,這不是說無服務器,而是開發(fā)者無需關心服務器,函數(shù)計算會為開發(fā)者分配實例執(zhí)行函數(shù)。
如上圖所示,當函數(shù)第一次被調(diào)用的時候,函數(shù)計算需要動態(tài)調(diào)度實例、下載代碼、解壓代碼、啟動實例,得到一個可執(zhí)行函數(shù)的代碼環(huán)境。然后才開始在系統(tǒng)分配的實例中真正地執(zhí)行用戶的初始化函數(shù),執(zhí)行函數(shù)業(yè)務邏輯。這個調(diào)度實例啟動實例的過程,就是系統(tǒng)的冷啟動過程。
函數(shù)邏輯執(zhí)行結(jié)束后,不會立即釋放掉實例,會等一段時間,如果在這段時間內(nèi)有新的調(diào)用,會復用這個實例,比如上圖中的 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)度實例、下載代碼、解壓代碼,啟動實例,又會遇到冷啟動。
所以,為了減小冷啟動帶來的影響,要盡可能避免冷啟動,降低冷啟動帶來的延時。
使用預留實例可以完全避免冷啟動,預留實例是在用戶預留后就分配實例,準備執(zhí)行環(huán)境;請求結(jié)束后系統(tǒng)也不會自動回收實例。
預留實例不由系統(tǒng)自動分配與回收,由用戶控制實例的生命周期,可以長駐不銷毀,這將徹底消除實例冷啟動帶來的延時毛刺,提供極致性能,也為在線應用遷移至函數(shù)計算掃清障礙。
如果業(yè)務場景不適合使用預留實例,那就要設法降低冷啟動的延時,比如降低代碼包大小,可以降低下載代碼包、解壓代碼包的時間。Initializer 函數(shù)是實例的初始化函數(shù),Initializer 在同一實例中執(zhí)行且只執(zhí)行一次,所以可以將一些耗時的公共邏輯放到 Initializer 中,比如在 NAS 中加載依賴、建立連接等等。另外要盡量保持請求連續(xù)穩(wěn)定,避免突發(fā)的流量,由于系統(tǒng)已啟動的實例不足以支撐大量的突發(fā)流量,就會帶來不可避免的冷啟動。
總結(jié)
以上是生活随笔為你收集整理的函数计算是如何工作的?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Serverless 的价值
- 下一篇: Serverless 技术选型