Serverless無服務器架構詳解

本文對Serverless架構的基礎概念、具體產品、應用場景、工作原理進行詳細解析。

基礎概念

Serverless: 無服務器架構,即在無需管理服務器等底層資源的情況下完成應用的開發和運行,是雲原生架構的核心組成部分。

通俗來說,如果將購買一臺物理服務器比作買車,購買雲服務器就類似於租車(租賃期間需要駕駛和維護,且即使閒置也需付費),那麼Serverless則類似於出租車(只需乘坐,按里程計費)。

從技術層面來說,我們可以簡單理解爲:Serverless = FaaS + BaaS。一個完整的Serverless應用一般由FaaS層的雲函數負責無狀態的計算,由BaaS層組件負責狀態的維護:

  • FaaS(函數即服務,Function as a Service):將函數代碼託管給雲產商,以服務形式運行,支持事件觸發。代表產品有騰訊雲SCF、AWS Lambda等。

  • BaaS(後端即服務,Backend as a Service):指雲平臺提供的後端組件整合,開發者無需開發和維護後端服務,通過API/SDK的調用便可獲得例如數據存儲(對象存儲、雲數據庫、雲中間件等)、消息推送、賬號管理、地圖定位、AI、IoT等能力。

Serverless組成

特點及優勢:

  1. 免運維:無需管理基礎設施 —> 可以專注業務開發

  2. 按量計費:閒時不計費 —> 降低成本

  3. 彈性伸縮:峯時自動擴容 —> 無需考慮可用性問題

劣勢及適用場景:

  1. 冷啓動延遲: 一定時間內的首次調用可能需要冷啓動(如進行加載代碼、拉起容器等任務)—> 適合對響應速度要求不是太高的接口,更適合異步任務,不適合啓動耗時久的Java項目

  2. 開發和管理設施: Serverless應用的調試、測試、排障、發佈等設施暫不成熟 —> 目前更適合後端邏輯不太複雜的輕量級應用

  3. 雲產商綁定: 不同雲產商提供的組件(如存儲)接口不同,可能增加未來遷移成本 —> 使用標準化框架,並在設計時儘量隔離通用邏輯層和BaaS依賴層

工作原理

雲函數之所以能做到按量計費和彈性擴容,與其實現機制是分不開的。核心原理是在函數被調用時才動態的啓動容器實例去執行,容器的生命週期很短,執行完後一定時間就會被回收,所以沒有調用時是不消耗任何資源的。而面對同一時間的並行調用,會啓動多個實例來完成執行,這也實現了單個請求級別的彈性擴容,且理論上是可以無限擴容的。

由於容器啓動本身需要耗時,所以一般的實現會在實例執行完之後保留一定時間窗口。大致的工作流程如下圖,其中步驟(1) (2) (3) (4) 爲冷啓動調用流程,(5) 爲非冷啓動調用。

工作原理

1.函數註冊

用戶在控制檯(或命令行)提交函數代碼到雲平臺,並進行函數配置。代碼一般會被作爲靜態資源保存(如對象存儲),而函數的元信息會被存入數據庫中(如mysql)。

2.函數觸發

雲函數的觸發可以分爲同步和異步兩種情況:

  • 如果是同步請求則等待函數執行結果後返回
  • 如果是異步請求則可以投遞到隊列後直接返回

3.函數執行

雲函數的執行可以分爲冷啓動和非冷啓動兩種情況:

  • 如果沒有可用的實例資源則進入冷啓動流程,需要進行宿主機調度,在宿主機拉起容器實例,下載函數代碼,然後執行代碼。
  • 首次執行完畢後docker容器不會立即關閉,會等待一定時間週期,如果此時有新的請求進來,會被分配到該容器,直接運行代碼。

冷啓動問題

前面說到雲函數的實現機制必須要在函數調用時纔去啓動運行環境,需要面臨冷啓動問題。雖然保留一定時間可以讓後續的請求無需加載,但如果在極短時間內併發大量請求,還是會同時啓動多個容器,影響首個請求的響應時間。前面也說到,雲函數的特性和機制決定了它的應用場景,對於同時要求高併發、低時延的場景並不是特別適合。

對於冷啓動問題,下面以騰訊雲的雲函數SCF爲例進行驗證。使用Postman的批量測試功能(Collection Runner)對雲上部署的一個Hello World函數進行串行測試。

SCF測試

從圖中可以看出,一段時間內的首次請求耗時會比其他請求的耗時高出一個數量級。

冷啓動優化

冷啓動的優化主要針對同步的請求,首先分析下冷啓動耗時的組成,主要是容器的拉起和代碼的下載(當然也有資源調度和網絡配置等,這裏暫不討論)。

1.代碼緩存:可以設計多級緩存,比如在宿主機上進行代碼包緩存,以及在可用區(AZ)內部進行緩存,這樣後續的首次啓動就可以快速就近獲取,而無需再次從對象存儲下載。

2.容器預創建:一個優化思路就是預加載,也就是預測將會到來的請求,提前拉起容器實例,從而減少耗時。有以下幾種可能的方案:

  • 進行請求量的實時計算,如果請求呈上升趨勢,就開始預創建容器實例,同理下降則進行回收。
  • 雲函數調用鏈: 這是一種可確定的預測,當雲函數之間出現互相調用,在前面的函數被觸發時就可以同時預創建調用鏈後面的實例;
  • 版本更新: 如果函數版本進行更新,則之後的所有請求都會重新冷啓動,爲了避免這種情況,需要預創建一些實例並下載新版本代碼,之後才能將流量平滑遷移到新版本函數。

應用場景

1.Rest API

利用雲函數可以快速部署一個Rest API應用,目前的雲廠商基本都支持大部分node,python和php的web框架,如koa、Express.js、Next.js、Flask、Django、Laravel等等。

這種web架構是前後端分離,即雲函數中的後臺接口只提供數據,頁面的渲染在瀏覽器進行。可以將前端的代碼部署到對象存儲中,並使用相關雲數據庫作爲數據存儲,這就成爲一個完整的雲上Full Stack應用。

2.SSR

SSR(Server-Side Rendering):後端渲染,即頁面直接在後臺進行渲染,瀏覽器只負責顯示。這種比較傳統的web架構很適合應用於Serverless,只需將整個後端代碼部署到雲函數即可,好處有:1.利於SEO,2.降低系統複雜度,易於部署。

Serverless很適合用於流量分佈不均的輕量應用,比如一些活動頁面,可能一個週期內只有很短的一段時間會有大量訪問,且需要長期的維護,此時爲這個應用去購買高配置的服務器顯然是不划算的。使用Serverless之後則可以完全解決這個問題,按量計費降低了成本,既免去了長期運維又不需要擔心擴容問題。

3.任務執行

雲函數本身是無狀態的,所以天然適合無狀態任務,如果需要狀態存儲則需要藉助BaaS層的組件。雲函數的優勢是可以與雲提供商下的其他服務(比如數據庫、緩存、對象存儲、CDN、AI、轉碼等)打通,在函數中使用SDK連接各個組件(但這同樣意味着將在雲產商綁定的道路上越走越遠)。以下是一些適用場景:

  • 消息通知:比如觸發後向某個用戶發送郵件、短信等。

  • 定時任務:雲函數一般提供定時器觸發,方便進行定時任務的執行。

  • CDN自動刷新:一般來說會把圖片、網頁等靜態資源存到對象存儲,並且配置CDN加速,一旦資源發生修改還得手動進行CDN刷新預熱。可以使用對象存儲上傳的事件觸發器,在雲函數中調用CDN接口自動化刷新預熱。

  • 視頻轉碼:如果雲產商提供轉碼服務,可以藉助雲函數很方便的完成轉碼任務。如原視頻上傳到對象存儲後,該事件可以觸發雲函數調用轉碼服務,並將轉碼後的視頻發佈到對象存儲中,如果使用了CDN還可以進行緩存刷新。

  • AI服務:可以使用雲函數調用該產生的AI服務,比如調用OCR接口識別圖片文字內容後返回。

  • Devops:例如將Github的webhook設置爲雲函數的地址,當代碼提交後觸發雲函數,執行CI/CD任務,構建後發佈產物到雲服務器上。

具體產品

下面以騰訊雲上的Serverless產品爲例介紹具體的使用實踐。

SCF雲函數

SCF (Serveless Cloud Function)是騰訊雲Serverless的核心產品,部署一個可以從公網訪問的雲函數只需簡單兩步:

1.函數編寫:可以直接在控制檯上的編輯器中編寫函數代碼,下圖就是一個Hello World雲函數:

雲函數編寫

2.創建觸發器:如果想通過瀏覽器進行函數調用,則創建一個API網關觸發器,會分配一個公網地址供訪問。API網關還支持綁定自定義域名,可實現通過 "{自定義域名}/{函數名}" 的方式訪問雲函數,例如 http://apigw.zhayujie.com/test

API網關觸發

除了網關觸發,SCF還支持對象存儲(COS)、消息隊列(Ckafka、CMQ)、定時任務等觸發器,方便雲函數與這些組件打通,可以衍生出很多應用場景。

Serverless Framework

Serverless framework是Serverless官方提供的標準化框架,目前支持該框架的產商有騰訊雲、AWS、Azure、Google等等。其目的一是完善Serverless項目的devops流程,包括開發、測試、管理、部署、監控等生命週期;二是提供一個標準接口,降低serveless應用對雲廠商的綁定,減小遷移成本。

對於簡單的函數可以在控制檯直接編寫和部署,但對於有一定規模的項目肯定是不能滿足的,我們不可能每次都在網頁上手動修改代碼,也不可能一一手動創建和管理所依賴的雲產品。

於是Serverless framework提供了基於命令行和IDE的一站式開發部署,方便快速構建Serverless應用。且騰訊雲將SCF、COS、CDN、數據庫等BaaS層的雲產品都抽象爲組件(Serverless framework components),在應用中可以方便的對這些資源進行創建、配置和管理。

CloudBase

雲開發CloudBase最初多用於爲小程序提供BaaS能力,使開發者可以免於維護服務器,採用全託管的方式開發小程序,如今雲開發還支持公衆號、web應用、Flutter客戶端等。

雲開發其實提供了一體化的開發環境,集成了FaaS層的雲函數和常用的BaaS層組件(NoSQL數據庫,COS雲存儲),以及提供了監控和日誌能力,基本涵蓋了應用開發所需的核心環境和工具。

總結

本文首先介紹了Serverless的概念,可簡單理解爲FaaS和BaaS的結合,並闡述了其優勢(免運維、按量計費、彈性伸縮),以及劣勢(延時、複雜應用支持、雲產商綁定)。

工作原理部分,介紹了雲函數的工作流程,包括函數註冊、函數觸發、函數執行,分析了冷啓動的問題,並提出了一些優化方案猜想(代碼緩存、容器預創建)。

應用場景部分,對web應用託管(Rest API、SSR)和任務執行這兩種常見應用場景提出了具體的實例。

最後介紹了騰訊雲上的Serverless產品,包括SCF雲函數、Serveless Framework、CloudBase雲開發,其中使用SCF創建了一個可從公網訪問的雲函數demo。希望讀完本文能對Serverless無服務架構有一個形象具體的認識。

本文鏈接: https://zhayujie.com/serverless-intro.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章