1. 程式人生 > >Serverless 的執行原理與元件架構

Serverless 的執行原理與元件架構

本文重點探討下開發者使用 Serverless 時經常遇到的一些問題,以及如何解決

過去一年,我們和大量 Serverless 使用者進行了線上和線下的交流,瞭解大家的業務場景、對 Serverless 的看法和使用體驗。

大部分使用者認為 Serverless 會是雲端計算下一階段的必然趨勢,但不是現在。 為什麼呢?因為構成 Serverless 架構的雲函式儘管有引以為傲的自動擴縮能力,但是糟糕的開發體驗、讓人畏懼的冷啟動、原有業務的改造難題等等,均降低了使用者的信心。

因此,儘管不少使用者認可 Serverless 的價值,但依然認為其很難承載核心業務。

針對這些關鍵問題,騰訊雲在今年 6 月份釋出了 Serverless 2.0,全面升級了產品形態、系統排程以及開發者工具。為了便於大家理解,我們就從雲函式的執行原理作為切入點,以解釋問題產生的原因以及雲函式的應對方法。


首先,我們看一下雲函式,或者說 FaaS 和 IaaS、PaaS 的區別。

如下圖所示,FaaS 不僅給使用者提供了標準的 Runtime,同時在應用層也幫使用者管理了請求的排程。開發者只需要聚焦在核心業務邏輯開發,按照函式的粒度去編寫程式碼。而與底層硬體相關的資源維護,則交給更加專業的雲廠商來搞定。

因此,對於使用者來講,可以把更多的精力和時間放在業務上。而 IaaS 和 PasS,則均需要使用者去運維雲主機或者容器叢集、搭建業務所需的執行環境。

其次,我們來看下雲函式如何構成 Serverless 架構,以及雲函式如何幫助使用者做資源管理和請求排程。

在這裡我們也將解答雲函式的冷啟、降低核心業務遷移複雜度等問題。

如下圖所示,開發者在實際使用時,可以藉助 Web IDE 或者本地 IDE 完成程式碼開發,然後通過外掛、工具等方式把程式碼及其相關依賴,一起打包部署到雲函式平臺,使用者可以自行選擇部署為函式形態或者服務形態。

在程式碼裡,使用者需要自己實現業務邏輯,比如訪問資料庫、物件儲存、訊息佇列、第三方服務介面等。計算邏輯和後端服務共同構成了所謂的 Serverless 應用架構。而終端使用者根據平臺提供的請求方式,去觸發部署在雲函式平臺上的業務程式碼,比如傳送 http 請求,平臺會根據使用者的請求量去拉起相應的計算資源執行使用者程式碼。

這裡需要重點關注函式形態和服務形態的差異,因為服務的形態可以大大降低複雜業務遷移的成本。

  • 服務形態支援直接部署基於框架開發的核心業務,如 Node.js 的 express、koa 等框架,不用為了應用 Serverless 而拆分成函式。平臺會幫使用者啟動服務程序、埠監聽,同時服務形態不會限制業務的實際執行時長。
  • 函式形態和服務形態在收到使用者請求的時候,均能實現自動擴縮。
    • 函式形態會針對使用者的每個請求都分配一個執行例項,因此所有請求的執行體驗是一樣的。當沒有請求的時候,平臺是沒有例項在執行的,所以可以做到按需請求,但是這也會造成所謂的冷啟動 —— 即當用戶的首次請求進入平臺的時候,平臺會臨時拉起資源,而這個過程會消耗一定的時間。為了消除冷啟,雲函式平臺會預先初始化一批不同規格的例項放在資源池中,當用戶有請求進入時,可以快速從資源池申請一個例項,直接掛載使用者的程式碼執行,從而降低了資源申請時間。同時,針對函式形態,平臺會根據歷史併發資料進行預測,幫使用者預留一定量的例項,這些例項會預先分配到使用者的賬號下並且載入好了使用者的程式碼,從而不僅直接消除了冷啟,也增加了例項複用機率。
    • 而服務形態可以至少幫使用者預留一個常駐例項,並且把使用者的所有請求都投遞到首個例項,根據例項的使用情況,自動的動態擴縮。

  • 函式形態更適合新建專案,可以敏捷迭代,業務按照函式的粒度開發,不僅可以輕鬆實現雲上多產品的聯動,也可以享受函式的高併發及效能一致體驗。服務形態更適合已有專案的遷移、重度複雜業務、需要長時執行的業務。

最後講講 Serverless 2.0 的元件架構。

如下圖所示,使用者雖然只需要關注綠色部分和業務相關的程式碼實現,但是平臺也需要提供強大的開發者工具來保障開發和使用體驗。如雲函式推出的 Serverless 本地開發工具、VS Code 外掛,與 CODING 聯合推出的 Web IDE、DevOps 平臺等,均能很大程度上提升開發、部署效率,實現本次開發、本地除錯、聯動雲端除錯、本地部署、版本釋出等能力。

同時,雲函式也完善了配套的監控和告警機制,提供如呼叫次數、記憶體使用、併發使用、超時、程式碼錯誤等多維度的監控和告警能力。這些基礎設施、資源管理、安全、容災等能力,是雲函式平臺必備的基礎能力,也是開發者關心的核心能力。

Serverless 不僅僅是計算,還需要不斷完善周邊生態。

隨著使用者量的增加,Serverless 必然會面臨更多的挑戰 —— 怎麼幫助使用者組織管理程式碼,怎麼解決帶狀態的業務訴求,怎麼實現資料庫連線數管理,怎麼實現應用級部署等等。我們也在不斷探索和優化使用者的使用體驗,計劃提供諸如 Serverless DB、效能監控、日誌分析、Serverless 框架、函式編排、高效能呼叫等功能。

後續的專欄文章也將陸續解讀更多核心能力,幫助開發者更好地理解和使用 Serverless。

Serverless is more!

傳送門:

  • GitHub: github.com/serverless
  • 官網:serverless.com

歡迎訪問:Serverless 中文網,您可以在 最佳實踐 裡體驗更多關於 Serverless 應用的開發