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