Serverless 系列(二):運行原理與組件架構

隨着越來越多的開發者開始關注並使用 Serverless 技術,開發者也對 Serverless 提出了更高的要求。上一篇文章中我們已經瞭解到 Serverless 相關的基本知識以及 Serverless 所帶來的一些優勢,本文就不再贅述。接下來,我們重點探討下現階段,開發者在使用 Serverless 時經常遇到的一些問題,以及騰訊雲 Serverless,尤其是雲函數爲此所做出的一些探索。

在過去一年多的時間裏,我和大量的 Serverless 用戶做過線上、線下交流,瞭解他們的業務場景、以及對 Serverless 的看法或者使用上的體驗。大部分用戶認爲 Serverless 會是雲計算下一階段的必然趨勢,但不是現在。爲什麼呢?因爲構成 Serverless 架構的雲函數雖然有引以爲傲的自動擴縮能力,但是糟糕的開發體驗、讓人畏懼的冷啓動、原有業務需要改造等等,均降低了使用者的信心。這也是當前不少用戶雖然認可 Serverless 的價值,但是認爲很難承載核心業務的原因。針對這些關鍵問題,騰訊雲在今年6月份的上海 KubeCon & CloudNativeCon 上發佈了 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本地開發工具、VSCode插件,和Coding聯合推出的WEB IDE、DevOps平臺等,均能很大程度上提升開發、部署效率,實現本次開發、本地調試、聯動雲端調試、本地部署、版本發佈等能力。同時雲函數也完善了配套的監控和告警機制,提供如調用次數、內存使用、併發使用、超時、代碼錯誤等多維度的監控和告警能力。對於基礎設施、資源管理、安全、容災等能力,是雲函數平臺必備的基礎能力,也是開發者關心的核心能力。​​

Serverless不僅僅是計算,還需要不斷完善周邊生態。隨着用戶量的增加,Serverless必然會面臨更多的挑戰,怎麼幫助用戶組織管理代碼,怎麼解決帶狀態的業務訴求,怎麼實現數據庫連接數管理,怎麼實現應用級部署等等。我們也在不斷探索和優化用戶的使用體驗,計劃提供諸如Serverless DB、性能監控、日誌分析、Serverless框架、函數編排、高性能調用等功能。後續的文章也會陸續推出更多的核心能力解讀,幫助開發者更好的理解和使用Serverless。

Serverless is more!

相關文章:

《Serverless 系列(一):基本概念入門》

作者介紹:

黃文俊,騰訊雲高級產品經理,負責騰訊雲 serverless 產品規劃。經歷過企業級存儲、企業級容器平臺等產品的架構與開發,對容器、微服務、無服務器、DevOps 都有濃厚興趣。對 Serverless 技術感興趣的讀者可關注 ServerlessCloudNative(ID:ServerlessGo)公衆號瞭解最新技術與動態。

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