阿里蔣航:Serverless 將使前後端從分離再度走向融合


在這裏插入圖片描述
近日,Serverless 作爲新興的架構模式,與其相關的話題被討論的如火如荼。Serverless 不需部署、配置和管理傳統服務器,這一概念的提出打破了前後端的壁壘,使得前端開發者能夠真正做到全棧,掀起新一輪的開發模式變革。

阿里雲前端工程師蔣航在 QCon 北京 2019 中的演講從前端開發模式的演進、基於 Serverless 的前端開發案例以及 Serverless 開發最佳實踐等方面,與大家分享了 Serverless 中的前端開發模式,小編也有幸就 Serverless 技術的問題對蔣老師做了一個採訪,內容整理如下。

1. Serverless 的背景和發展歷程

InfoQ:Serverless 的背景和發展歷程是什麼?

蔣航:雲計算經過了從物理機到虛擬機、從虛擬機到雲計算、從雲計算到容器這幾個階段,而容器之後的下一個階段,則是 Serverless。2009 年 Berkeley 在《Above the Clouds: A Berkeley View of Cloud Computing》 這篇論文中定義了雲計算,並提出了雲計算的六個優點:

  1. 按需提供無限計算資源。
  2. 消除雲用戶的前期承諾。
  3. 根據需要在短期內支付使用計算資源的能力。
  4. 由於許多非常大的數據中心,大規模降低成本的規模經濟。
  5. 通過資源虛擬化簡化操作並提高利用率。
  6. 通過複用來自不同組織的工作負載來提高硬件利用率。

今天被大家討論的 Serverless 則最大程度體現了這些優點。從時間上來看,2014 年 11 月,AWS Lambda 的發佈,標誌則 Serverless 發展的開始。2016 年 Google Cloud Function 和微軟 Azure Function 產品的發佈,標誌着 Serverless 漸漸成熟。2017 年 4 月,阿里雲函數計算和騰訊雲無服務器函數的發佈,則標誌着國內 Serverless 發展的成熟。2018 年 9 月,支付寶小程序和微信小程序的雲開發功能發佈,標誌着國內 Serverless 應用場景的落地。

2. Serverless 的概念及定義

InfoQ:BaaS 出現很早,但一直沒火起來,包括 Facebook 關閉了 Parse 服務,爲什麼現在又認爲 Serverless 必須依賴它?

蔣航:現在公認的 Serverless 的定義,是 Serverless = FaaS + BaaS

傳統的編程中,我們定義一個函數,函數針對輸入計算輸出,這些函數組成了一個應用程序。而 FaaS 則讓我們能夠在雲端編寫、運行函數,並由這些雲函數組成應用程序。

FaaS 本身提供的只有運行函數的功能,並且每個函數的執行都是孤立和短暫的。但我們的應用程序,往往還需要持久存儲和臨時存儲,以及在存儲中進行數據管理,所以我們需要 BaaS。BaaS 就是一些列後端的功能的集合,比如雲數據庫、對象存儲、消息隊列、通知服務。沒有這些 BaaS,函數的能力是非常有限的。整個 BaaS 也都由雲供應商廠商提供,開發者不需要關心具體細節、實現,只需要在 FaaS 中使用 BaaS,這樣才能構建整個應用。

3. Serverless 的優缺點

InfoQ:Serverless 架構與傳統架構相比的優勢在哪裏?

蔣航:我覺得 Serverless 相比傳統 Serverfull 架構主要有以下幾個優勢:

  • 無需運維
    Serverless 架構的核心思想就是,構建和運行程序不需要管理服務器等底層資源。基於 Serverless 架構,應用的部署、擴容、備份、容災、監控、日誌等都不需要開發者關心,這些功能全都由雲供應商提供。開發者就可以從以往繁瑣的運維工作中解脫出來,專心實現自己的產品。
  • 低成本
    傳統的 Serverfull 架構,我們需要爲資源付費。很多時候我們的雲服務器等資源都是空閒的,但也需要計算費用,這就造成了不必要的浪費。但 Serverless 架構,我們只需要爲計算付費。函數每執行一次,付一次的費用。比如阿里雲函數計算、AWS Lambda、微軟 Azure Function 等產品,定價幾乎都是 1.33 元 / 百萬次 的執行次數,0.00011108/GB-s 的運行時間,如果你的應用比較輕量,每個月的成本是非常低的。
  • 更簡單
    相比傳統架構下的開發,基於 Serverless 架構的開發將變得更簡單。雲計算平臺已經爲我們提供了一系列的基礎設施,我們只需要在此之上進行應用開發。傳統架構,就猶如編程語言中的底層語言,如彙編,我們需要關心每一個細節,細緻到 CPU 寄存器這樣的級別。而基於 Serverless 的開發,就猶如 Node.js、Python 等高級語言,我們只需要專注於業務邏輯的實現,可以很高效地構建一個應用,並且這個應用天然就是彈性可伸縮的。

4. Serverless 的實踐

4.1 InfoQ: 依據 Serverless 的概念定義,在實際開發中如何保證性能?有實際的解決方案嗎?如果有的話能具體講一下怎麼實現的嗎?

蔣航:Serverless 的性能,也是絕大部分開發者都關注的一個話題。相比傳統架構,Serverless 架構下,程序的運行需要經過一些列步驟:

  1. 下載代碼
  2. 啓動容器
  3. 啓動運行環境
  4. 執行代碼

前三步統稱爲冷啓動。傳統應用則完全沒有冷啓動時間。冷啓動時間的長短,直接決定了應用性能的高低。
一方面,冷啓動時間需要 Serverless 服務提供商去優化;另一方面,作爲開發者,我們也可以從應用的角度去優化。首先就是選用合適的編程語言。因爲 Java 等高級語言的冷啓動時間大約是 Node.js、Python 等語言的 100 倍。其次是爲函數分配合適的內存。一般而言,內存越大,冷啓動的時間越短。基於這點,開發者也可以爲 Java 分配更大的內存,使其冷啓動時間和 Node.js 一樣短。但更大的內存意味着更多的支出。所以爲函數選用合適的內存很重要。

還有就是重複利用函數的執行上下文。當一個事件來臨,函數冷啓動並執行之後,運行環境並不會立即被銷燬,而是在一定時間內處於冷凍狀態繼續等待下一次函數執行。這也是 Serverless 服務平臺的一個性能優化方案。基於這樣的特點,我們就可以將數據庫連接、臨時文件等保存在執行上下文中,從而使函數無需在每次運行時都創建這些資源。

除此,我們還可以對函數進行預熱。可以通過定時對函數進行調用的方式,使函數一直處於“溫暖”狀態,從而避免真實請求到來時函數進行冷啓動,進而達到提高性能的目的。

4.2 InfoQ: Serverless 有那些應用場景,實際開發中表現如何?遇到哪些技術痛點?

蔣航:根據 2018 年的調研,有接近三分之一的用戶,將 Serverless 用於接口的開發,還有大部分用來做數據處理、第三方無服務集成或內部工具。
在這裏插入圖片描述
圖片來源:https://www2.eecs.berkeley.edu/Pubs/TechRpts/2019/EECS-2019-3.pdf
理論上來說,傳統架構能做的事情,Serverless 都能做。Serverless 比較適合有顯著波峯波谷的應用或基於事件處理的一些場景。

比如一個系統白天用戶量很大,晚上基本沒有用戶,使用傳統架構,晚上服務器資源就是浪費的;而使用 Serverless 架構,只需要爲實際的計算付費。

再比如上傳圖片後,需要對圖譜進行壓縮、裁剪然後再存儲,使用 Serverless 用戶只需要在函數中定義好處理邏輯,具體的執行由雲計算平臺來做。上傳圖片就是觸發雲計算平臺執行代碼的事件。

對於一般應用,實際開發中的痛點,一方面是函數的測試,因爲 Serverless 函數往往依賴於第三方服務,如 FaaS 和 BaaS,我們很難對使用了這些服務器的函數進行測試。同時函數是事件驅動的,觸發函數執行的事件,在本地也很難模擬。所以要能夠方便地對 Serverless 函數進行測試,就需要我們在開發過程中,將函數的業務邏輯和所依賴的第三方服務分離,這樣就可以編寫單元測試對函數進行測試。另一方面,是函數的性能,性能問題上面已經提到。

對於一些複雜的大型企業級應用,現在我們還很難基於簡單的 FaaS 平臺去開發。這可能需要一個能夠超越 FaaS 的一個可編程框架。

4.3 InfoQ: Serverless 運行在雲服務上,這方面會帶來什麼限制嗎?

蔣航:最主要的限制就是我們基於 Serverless 的應用嚴重依賴雲服務。雲服務的穩定性直接決定了業務的穩定性。當然,我覺得這方面也不用過於擔心。雲服務肯定會有比我們更專業的開發者去維護。

其次,應用的多雲部署或應用的遷移,也會比較麻煩。因爲目前 Serverless 還沒有一個統一標準,各個雲供應商的 FaaS 和 BaaS 實現也不一樣。所以當我們想要把 Serverless 應用從一個雲服務遷移到另一個雲服務,就會變得很困難。解決這個問題的方法,就是儘量讓我們的業務代碼和所依賴的雲服務分離。這樣遷移的時候,就只需要修改依賴雲服務的相關代碼。

Serverless 還存在的另一個問題是底層硬件資源的不確定性。由於雲供應商可以靈活的選擇底層服務器的規格和型號,這就導致了每個雲函數運行的物理環境性能不盡相同。這種不確定性其實暴露了雲供應商的背後的目的:他們想要最大化的平衡資源的使用和預算。

5. Serverless 對前端的影響

5.1 InfoQ: Serverless 對前端開發模式帶來什麼的變化?

蔣航:縱觀整個前端開發模式的演進歷程,前端開發由最初的基於 JSP、PHP 等後端語言的模板渲染,演變到了基於 AJAX 的前後端分離,進而再演便到了現在的 BFF(Backend For Frontend)架構模式。

因爲前後端分離後,前端的應用變得更加複雜,端也由 PC 端擴展到移動端、客戶端甚至 IoT;後端應用也由單體應用轉變爲了微服務應用,接口變得更加原子化,前後端接口協調開始變得困難。所以前端開始尋求使用 BFF 來做接口的聚合、裁剪,甚至使用 Node.js 來做全棧開發。不管 BFF 也好、全棧也好,都會涉及到服務器的運維,這恰好是前端工程師所不擅長的。而 Serverless 正好能解決這一問題。

基於 Serverless,前端工程師將再度迴歸到 Web 應用工程師這一職能,前後端也將由分離再度走向融合。前後端的協調也不在是基於接口的協調,而是基於 Serverless 函數的協調。前端工程師能夠基於 Serverless 去開發函數、實現後端功能。而後端工程師則去實現不適用函數編寫的功能,或者供函數使用的一些微服務。對前端工程師來說,後端變得更簡單了;對後端工程師來說,後端變得更靠後了。整體而言,應用的開發效率也大幅提升,開發者只需要關注於業務邏輯的實現,我們可以使用更少的技術在更短的時間內得到更多的產出。

5.2 InfoQ:隨着前端開發模式的不斷演進,目前大部分採用 Node.js 開發 Serverless 應用,爲什麼選用 Node.js? 有什麼優勢?

蔣航:第一, Node.js 的足夠簡單、輕量。
拿 Node.js 和 Java 來對比,開發同樣的功能,Node.js 的代碼會比 Java 少很多。Node.js 函數所消耗的內存等資源也比 Java 要少。再如常用的 REST API 接口中,JSON 格式在 Node.js 裏面是原生支持的,而 Java 需要使用第三方庫來轉換。
第二, Node.js 冷啓動時間比 Java、C# 等編譯型語言要低很多。
有測試表明,Node.js 的冷啓動時間比 Java 大約低 100 倍。對於 Serverless 應用來說,冷啓動時間是函數性能的關鍵因素,因此從性能上來說 Node.js 也是開發的首選。
第三,是 Serverless 對前端友好。
前端開發者是 Serverless 的主要使用者和受益者,基於 Serverless 架構,前端開發者可以很容易地開發服務端程序,能夠很快速地實現一個完整的應用。而前端開發者最熟悉的服務端語言便是 Node.js,因此很多 Serverless 應用使用 Node.js 實現。

5.3 InfoQ: 在 Serverless 的大勢所趨下,對前端開發人員的技能有哪些新的要求?

蔣航:最主要的,當然是對 Serverless 架構的學習和理解。當我們在使用一項新技術的時候,一定要充分了解到它的優缺點、適用和不適用場景。

對於前端工程師來說,Serverless 使開發變得更簡單了,前端工程師可以很方便進行後端的開發。但前端開發後端,依舊存在一定門檻。前端工程師依舊需要學習一些基本的後端開發知識。

Serverless 也不等於無服務器,只是我們不再需要關心服務器。雖然 Serverless 可以極大程度幫助我們減少運維工作,但我們還是可以瞭解一些基本的運維知識,這樣遇到問題,可以更快速、高效進行排查。

6. Serverless 未來的發展

InfoQ: 您怎麼看待 Serverless 在未來的發展,在其推廣普及的道路上會有怎樣的際遇?

蔣航:Serverless 是一種新的架構模式,還在不斷髮展和完善中。

未來 Serverless 標準一定會走向統一。目前還沒有一個統一的 Serverless 標準,不同的雲供應商在實現自己的 Serverless 平臺。這給開發者的多雲部署或應用遷移帶來了極大的挑戰,也給 Serverless 發揮其潛力帶來了限制。因此社區中需要一個能兼容各個服務供應商、封裝好部署函數和管理生命週期的框架。在國外有 Serverless Framework 這樣的產品在做這些事情,但它們基本都不支持國內的 Serverless 平臺如阿里雲、騰訊雲,國內現在也沒有這樣的框架。

Serverless 架構在未來也一定會成爲主流。現在的 Serverless 還存在的很多限制,比如缺乏細粒度模式的存儲支持、缺乏細粒度的協調、缺乏標準的通信模式、還有性能問題;一些非常複雜的業務場景、大型的企業級系統也很難基於簡單的 FaaS 平臺去開發。這也就導致了現在大部分 Serverless 使用者,只是將其用在一些非核心的場景中。一種技術架構走向主流,一定是要經過經過大規模的實踐、經過複雜系統的驗證。引用一句話,“架構級的演進機會不是年年都有,甚至是 5 年、10 年都不一定能碰到一次,所以這也同樣意味着這是個巨大的機會。”

參考文獻:

轉載自:阿里蔣航:Serverless 將使前後端從分離再度走向融合

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