
作者 | 孔德慧(夏莞) 阿裡雲函數計算開發工程師
本文整理自《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 技術趨勢,更關注你在落地實踐中遇到的問題。