從零入門 Serverless | 一文搞懂函式計算及其工作原理

阿里巴巴雲原生發表於2020-06-28

1.png

作者 | 孔德慧(夏莞) 阿里雲函式計算開發工程師

本文整理自《Serverless 技術公開課》, 關注 Serverless 公眾號,回覆“入門”,即可獲取 Serverless 系列文章 PPT

什麼是函式計算?

大家都瞭解,Serverless 並不是沒有伺服器,而是開發者不再需要關心伺服器。下圖是一個應用從開發到上線的對比圖:

2.png

在傳統 Serverful 架構下,部署一個應用需要購買伺服器,部署作業系統,搭建開發環境,編寫程式碼,構建應用,部署應用,配置負載均衡機制,搭建日誌分析與監控系統,應用上線後,繼續監控應用的執行情況。而在 Serverless 架構下,開發者只需要關注應用的開發構建和部署,無需關心伺服器相關操作與運維,在函式計算架構下,開發者只需要編寫業務程式碼並監控業務執行情況。這將開發者從繁重的運維工作中解放出來,把精力投入到更有意義的業務開發上。

3.png

上圖展示了函式計算的使用方式。從使用者角度,他需要做的只是編碼,然後把程式碼上傳到函式計算中。上傳程式碼就意味著應用部署。當有高併發請求湧入時,開發者也無需手動擴容,函式計算會根據請求量毫秒級自動擴容,彈性可靠地執行任務,並內建日誌查詢、效能監控、報警等功能幫助開發者發現問題並定位問題。

函式計算核心優勢

4.png

1. 敏捷開發

  • 使用函式計算時,使用者只需聚焦於業務邏輯的開發,編寫最重要的 “核心程式碼”;
  • 不再需要關心伺服器購買、負載均衡、自動伸縮等運維操作;
  • 極大地降低了服務搭建的複雜性,有效提升開發和迭代的速度。

2. 彈性擴容

  • 函式計算根據請求量自動進行彈性擴容,無需任何手動配置;
  • 毫秒級排程計算資源,輕鬆應對業務洪峰。

3. 穩定高可用

  • 函式計算分散式叢集化部署,支援多可用區;
  • 如果某個可用區因自然災害或電力故障導致癱瘓,函式計算會迅速切換到同區域其他可用區的基礎設施執行函式,確保服務高可用。

4. 有競爭力的成本

  • 函式計算提供了豐富的計量模式,幫助您在不同場景獲得顯著成本優勢;
  • 後付費模型按實際使用計算資源計費,不佔用計算資源則不計費,資源利用率高達 100% ;
  • 預付費模型根據業務負載估算提前預購計算力,單價更低,組合使用後付費和預付費方式將有效降低成本。

函式計算使用場景

5.png

從使用場景來說,主要有三類:

  • Web 應用:可以是各種語言寫的,這種可以是使用 Serverless 框架新編寫的程式,也可以是已有的應用。比如可能是小程式後端,也可能是 Web API;

  • 對計算能力有很強的彈性訴求的應用:比如 AI 推理、音視訊處理、圖文轉換等;

  • 事件驅動型的應用:比如通過其他阿里雲產品驅動的場景,Web Hook、定時任務等。

函式計算已經與很多產品進行了打通,比如物件儲存、表格儲存、定時器、CDN、日誌服務、雲監控等十幾個產品,可以非常快速地組裝出一些業務邏輯。

函式計算工作原理

1. 函式計算呼叫鏈路

6.png

上圖展示了函式計算完整的請求和呼叫鏈路。函式計算是事件驅動的無伺服器應用,事件驅動是說可以通過事件源自動觸發函式執行,比如當有物件上傳至 OSS 中時,自動觸發函式,對新上傳的圖片進行處理。函式計算支援豐富的事件源型別,包括日誌服務、物件儲存、表格儲存、訊息服務、API 閘道器、CDN 等。

除了事件觸發外,也可以直接通過 API/SDK 直接呼叫函式。呼叫可以分為同步呼叫與非同步呼叫,當請求到達函式計算後,函式計算會為請求分配執行環境,如果是非同步呼叫,函式計算會將請求事件存入佇列中,等待消費。

2. 函式計算呼叫方式

7.png

同步呼叫的特性是,客戶端期待服務端立即返回計算結果。請求到達函式計算時,會立即分配執行環境執行函式。

以 API 閘道器為例,API 閘道器同步觸發函式計算,客戶端會一直等待服務端的執行結果,如果執行過程中遇到錯誤, 函式計算會將錯誤直接返回,而不會對錯誤進行重試。這種情況下,需要客戶端新增重試機制來做錯誤處理。

8.png

非同步呼叫的特性是,客戶端不急於立即知道函式結果,函式計算將請求丟入佇列中即可返回成功,而不會等待到函式呼叫結束。

函式計算會逐漸消費佇列中的請求,分配執行環境,執行函式。如果執行過程中遇到錯誤,函式計算會對錯誤的請求進行重試,對函式錯誤重試三次,系統錯誤會以指數退避方式無限重試,直至成功。

非同步呼叫適用於資料的處理,比如 OSS 觸發器觸發函式處理音視訊,日誌觸發器觸發函式清洗日誌,都是對延時不敏感,又需要儘可能保證任務執行成功的場景。如果使用者需要了解失敗的請求並對請求做自定義處理,可以使用 Destination 功能。

3. 函式計算執行過程

函式計算是 Serverless 的,這不是說無伺服器,而是開發者無需關心伺服器,函式計算會為開發者分配例項執行函式。

9.png

如上圖所示,當函式第一次被呼叫的時候,函式計算需要動態排程例項、下載程式碼、解壓程式碼、啟動例項,得到一個可執行函式的程式碼環境。然後才開始在系統分配的例項中真正地執行使用者的初始化函式,執行函式業務邏輯。這個排程例項啟動例項的過程,就是系統的冷啟動過程。

函式邏輯執行結束後,不會立即釋放掉例項,會等一段時間,如果在這段時間內有新的呼叫,會複用這個例項,比如上圖中的 Request 2,由於執行環境已經分配好了,Request 2 可以直接使用,所以 Request 2 就不會遇到冷啟動。

Request 2 執行結束後,等待一段時間,如果這段時間沒有新的請求分配到這個例項上,那系統會回收例項,釋放執行環境。此例項釋放後,新的請求 Request 3 來到函式計算,需要重新排程例項、下載程式碼、解壓程式碼,啟動例項,又會遇到冷啟動。

所以,為了減小冷啟動帶來的影響,要儘可能避免冷啟動,降低冷啟動帶來的延時。

10.png

使用預留例項可以完全避免冷啟動,預留例項是在使用者預留後就分配例項,準備執行環境;請求結束後系統也不會自動回收例項。

預留例項不由系統自動分配與回收,由使用者控制例項的生命週期,可以長駐不銷燬,這將徹底消除例項冷啟動帶來的延時毛刺,提供極致效能,也為線上應用遷移至函式計算掃清障礙。

如果業務場景不適合使用預留例項,那就要設法降低冷啟動的延時,比如降低程式碼包大小,可以降低下載程式碼包、解壓程式碼包的時間。Initializer 函式是例項的初始化函式,Initializer 在同一例項中執行且只執行一次,所以可以將一些耗時的公共邏輯放到 Initializer 中,比如在 NAS 中載入依賴、建立連線等等。另外要儘量保持請求連續穩定,避免突發的流量,由於系統已啟動的例項不足以支撐大量的突發流量,就會帶來不可避免的冷啟動。

課程推薦

為了更多開發者能夠享受到 Serverless 帶來的紅利,這一次,我們集結了 10+ 位阿里巴巴 Serverless 領域技術專家,打造出最適合開發者入門的 Serverless 公開課,讓你即學即用,輕鬆擁抱雲端計算的新正規化——Serverless。

點選即可免費觀看課程: https://developer.aliyun.com/learning/roadmap/serverless

更多詳情請關注 Serverless 。Serverless 公眾號,關注 Serverless 技術趨勢,更關注你在落地實踐中遇到的問題。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69953029/viewspace-2700885/,如需轉載,請註明出處,否則將追究法律責任。

相關文章