如何落地一個FaaS平臺?

雲棲號資訊:【點擊查看更多行業資訊
在這裏您可以找到不同行業的第一手的上雲資訊,還在等什麼,快來!

image

阿里妹導讀:函數即服務(FaaS)作爲雲計算 2.0 時代重要的發展方向,能夠從工程效率、可靠性、性能、成本等方面給開發者帶來巨大的價值,尤其是能夠極大地提升研發效率。因此,擁抱FaaS成爲開發者關心的重要技術領域。阿里文娛技術專家墨洵、研發工程師武升將介紹文娛函數計算平臺的設計思想與關鍵技術難點,並結合業務介紹函數計算的落地實踐經驗。

一 背景

優酷內容分發業務涵蓋了優酷主客的首頁、頻道頁、二級頁等不同場景下的內容分發,服務端之前採用傳統的Java應用結合阿里集團中間件的開發模式,一直是產品評審、API設計、前後端聯調、前後端發版等節奏。然而,隨着端上內容的多樣化,產品需求迭代的加速,傳統的服務端架構開發模式已顯得力不從心,我們雖然沉澱出一套通用框架,但受限於開發模式的本質並沒有變化,業務開發的靈活性與開發成本依然很高。總結起來,面臨的挑戰主要是:API依賴數據源多,業務需求變化快,前後端聯調成本大等。

隨着Serverless技術的發展,FaaS的相關實踐探索都在阿里內部逐漸多起來,我們思考了FaaS的特點和麪臨的挑戰,希望通過FaaS技術的引入,把一系列基礎能力沉澱下來,在此之上,通過FaaS來承接上層業務邏輯,阿里巴巴文娛優酷FaaS平臺應運而生。

二 平臺設計與技術難點

1 設計目標

希望實現一個通用的函數計算平臺,在這個平臺上,開發者直接通過編寫、運行和管理一個或多個函數對外提供服務,允許通過微服務、HTTP接口、事件源觸發等多種方式調用函數。同時,函數的開發及發佈應該是秒級生效,且無需重啓宿主應用的,這樣就可以克服傳統Java應用發佈部署的時間成本,極大的減輕開發者在代碼開發之外的時間成本,同時可以快速回滾。

FaaS平臺應該提供函數式應用的運行環境,應該支持輕量級腳本語言編寫函數。我們首選Groovy語言,主要是考慮了Groovy的代碼簡潔,同時可以訪問Java的原生的類和對象。

FaaS可以根據實際的訪問情況進行函數實例的動態加載和資源分配。

總結起來,在FaaS平臺上運行的函數應該是一個短小、離散、可複用的代碼塊,我們希望它有以下幾個特點:

  • 生命週期短,支持快速發佈部署
  • 非守護進程(不需要長時間運行,按需加載)
  • 不提供長連接服務
  • 無狀態
  • 可重用現有服務或第三方資源(重點,FaaS應該建立在完善的基礎服務上)
  • 毫秒級執行時間

2 平臺整體設計

FaaS平臺的整體核心架構主要由網關、運行時容器、一站式運維發佈平臺、基礎服務等組成:

image

網關層主要負責接受函數調用請求,通過函數的唯一標識及函數的集羣信息分發函數調用到對應集羣的機器環境中執行。

函數容器層是整個系統的核心,主要通過函數執行引擎進行實例的調用執行,同時負責函數實例的生命週期管理,包括按需加載、代碼預熱、實例卸載回收等工作。

一站式發佈運維平臺(FaaS Platform)是面向開發者的主要操作平臺,開發者在平臺上進行函數編寫、版本提交發布、回滾、監控運維等一系列工作。整個監控體系打通了集團的基礎服務監控體系,,可以提供實時大盤,集羣性能等基本監控指標的查詢功能。

整個FaaS平臺建立在集團中間件以及優酷內容分發依賴的各基礎服務之上,通過良好的封裝向開發者提供簡潔的服務調用方式,同時函數本身的執行都是運行在互相隔離的環境中,通過統一的函數實例管理,進行函數的調度、執行監控、動態管理等。

整體技術棧服務端容器層主要是採用Java實現,結合集團中間件完成整個容器層的主要功能。

前端主要基於React框架和Dva狀態管理框架實現。當然,在實際開發過程中我們選擇了螞蟻金服的Bigfish框架和Odin腳手架。React提供了組件化的概念,這意味着我們開發的組件可以像HTML基本DOM元素一樣不斷被複用。爲了實現組件的複用化和研發效率的提升,Bigfish在Web頁面上進行了分層設計,細粒度從大到小依次爲:頁面模板 -> 區塊 -> 業務組件 -> 組件。Odin腳手架是優酷推出一款面向中後臺業務系統的前端開發腳手架,集成了Bigfish的框架,支持以配置化的方式構建網站路由,使得開發者不需要關注過多底層細節,可以快速上手實現業務邏輯和頁面構建。

image

類似於服務端側的MVC分層模式,前端在實現業務邏輯和數據通信時也有對應的封層設計模式,來實現組件的狀態管理。經歷了從Flux -> Redux -> Dva的衍變,狀態管理機制對複雜業務帶來的益處正在不變突出。Dva的完整數據流圖如下:

image

State是負責保存整個應用狀態,View是React組件構成的視圖層,Action是描述事件的對象。connect方法是綁定 State 到 View的函數,使得View層的組件可以動態監聽State中的屬性,同時可以通過dispatch方法負責將Action發送至State觸發狀態改變。觸發狀態改變有兩種類型的函數:effect函數和reducer函數。前者會與服務端進行數據通信,可以處理異步動作;後者處理同步動作,並直接更新State。

FaaS Platform前端主要分爲函數創建、函數管理、函數發佈、函數模板和應用統計五個模塊。在FaaS Platform系統中,函數是對外可被調度的最小單元,而應用是劃分機器資源的最小單位,所以我們設定應用與函數存在一對多的映射關係。

image

函數創建模塊

函數創建模塊主要提供添加函數的功能。一個完整函數必須包括函數名稱、函數標識、函數類型、函數所屬應用及應用下所屬分類等基本信息;同時類似於mtop網關,我們提供對於函數入參、響應業務結果、響應業務錯誤碼的配置頁面,用於自動生成函數調用入參表單和函數接口文檔。函數的英文標識唯一確定一個函數,不可重複。

函數管理模塊

函數管理模塊主要提供函數的CRUD操作和函數的在線編寫功能。在本頁面我們可以快速進行復雜條件的函數查詢和函數基本信息和狀態的編輯。同時我們提供函數編寫的在線Web IDE,支持文件增刪、代碼編寫、自動保存、函數提交、函數調試、日誌打印等功能。

函數發佈模塊

函數發佈模塊主要提供函數提交歷史的查詢和執行函數發佈的功能。我們像傳統Java應用支持引入二三方依賴,但不同於傳統的Java應用發佈,FaaS Platform系統中的函數發佈可以實現秒級發佈。目前函數發佈已經支持函數回滾發佈和函數分批次發佈,從部署環節實現對複雜多變業務需求的快速響應。

函數模板模塊

函數模板模塊主要提供函數模板的CRUD操作和函數的在線編寫功能。結合實際的業務場景,我們首先提供一些基礎的內置模板,方便函數的快速初始化。同時對於某一個業務問題的完整解決方案,我們允許該函數保存爲自定義的函數模板。函數模板的Web IDE同樣支持函數模板的在線編寫、調試、自動保存等功能。

應用統計模塊

由於函數隸屬於應用從而具備機器資源,我們計劃提供應用統計模塊以應用爲拆分進行函數上線狀態、發佈版本的數據統計;同時我們也基於函數日誌提供函數調用情況(調用量、成功率、響應時間)的統計分析和監控。關於具備的細節,我們正在逐步實現和完善。

3 主要特性

優酷FaaS平臺的主要特性是開發接入低成本、函數運行時環境隔離以及運維監控操作的透明化。

image

開發接入低成本

FaaS平臺通過一站式的雲端開發平臺,使用戶可以直接面向業務邏輯的開發,而無需關注基礎服務及中間件的依賴,平臺本身提供完善的基礎能力封裝,包括:快捷開發能力,中間件快速接入能力,數據存儲快速接入能力,基礎能力封裝直接調用等。

業務邏輯開發模式輕量化、無應用化,發佈回滾秒級生效,極大的減輕了傳統服務端開發過程的繁瑣流程,將開發者的精力更多的集中於核心業務邏輯的開發。

同時提供如下的簡潔易於操作的開發部署流程設計,減輕開發者開發部署的時間成本。

image

FaaS平臺上的函數除了開發成本低,調用者接入的方式也比較簡單。我們同時提供了中心化和去中心化兩種使用方式,不管去中心化還是中心化使用方式,函數代碼的編寫、調試、發佈均在一站式運維發佈平臺上完成。在中心化接入方式下,我們通過統一的函數服務集羣提供對外服務,允許調用者通過統一的函數調用接口以HSF服務或者HTTP接口調用函數,而函數代碼的執行完全在我們的函數服務集羣上,開發者無需自己申請應用。

對於去中心化接入方式,開發者如果想調用函數平臺上的FaaS函數,可以引入我們提供的SDK,此時,函數的執行完全在調用者應用的本地進程裏,FaaS平臺只提供函數的開發發佈功能。

運行時環境的隔離

運行時環境的隔離分爲兩個層次,一個層次是函數容器內部函數實例之間的隔離;另外一個層次是不同函數本身就運行在不同的虛擬應用集羣上,集羣與集羣之間的隔離性。

函數容器內部函數實例的隔離指的是在FaaS平臺上編寫的Groovy函數運行在統一的JVM進程中,每個函數在開發的過程中都會生成多個版本,而不同函數之間、同一函數的不同版本之間在運行時的環境都是相互隔離,互不干擾的。

image

函數運行集羣的隔離性主要是根據函數的訪問量、函數的服務特點(長尾服務還是通用服務)等特性,在函數創建之初就將函數綁定在不同的虛擬應用上,而不同的應用會運行在不同的機器集羣上,函數在被調用時,網關層可以根據函數的應用將函數的調用分發到不同的集羣上執行,保證函數之間物理隔離。

image

運維監控的透明化

FaaS平臺的函數都能在平臺上直接進行監控運維操作,我們通過在函數執行流程上收集函數的執行日誌,並將日誌實時上報到集團監控服務,可以在平臺上實時監控函數運行。

image

4 技術難點

函數執行引擎設計

函數執行引擎是整個FaaS的核心部分,負責函數實例的加載、預熱、調度執行、卸載等生命週期管理。FaaS的函數目前支持Groovy語言,選擇Groovy主要是由於JVM提供的運行時環境天然支持Groovy語言的運行。FaaS平臺上每個函數都具有一個自己獨立的代碼版本庫,每次提交都將生成遞增的版本,執行引擎加載函數實例時會從版本庫中加載當前最新版本的代碼,通過初始化、預編譯等操作生成函數的實例放到實例池中,由於每個函數都有唯一標識,因此,當調用某個具體的函數時,執行引擎會從實例池中取出對應實例加載執行。整個流程如下圖所示:

image

由於函數實例都存在於同一個JVM進程中,並且不同於服務,函數的粒度更小,因此函數的生命週期需要嚴格控制,不然大量函數加載到內存中,有可能出現內存佔用過大的問題。同時兼顧SDK調用方式,防止多個函數常駐內存將宿主應用的內存耗盡。所以目前採用了懶加載機制,按需加載函數實例到內存中,過期自動回收,有助於釋放內存提高內存利用率。

image

每個Groovy函數對應一個Groovy的解釋器環境GroovyEngine,不同的函數之間相互獨立,每個函數在加載到內存的過程中都分別獨立的進行預編譯,初始化等流程,防止不同函數之間相互干擾,同時爲二三方JAR包加載提供隔離的環境,防止出現不同函數之間的類加載器相互影響的情況。

image

二三方JAR包加載能力

FaaS平臺提供二三方JAR包的加載能力,允許在不重啓整個底層容器的情況下,加載函數自己的二三方依賴,我們通過實現Groovy二三方JAR包加載能力的Classloader,實現了函數與函數之間、函數不同版本之間的二三方依賴加載能力。FaaS平臺的Classloader體系:

image

三 FaaS平臺的落地探索

結合目前阿里文娛業務的特點,即大多以內容分發爲主,以首頁、二級頁等業務來看,內容分發具有運營坑位多、需求變化快、數據源多等特點,傳統的Java服務端開發方式,前後端聯調以及後端開發部署都逐漸成了影響迭代效率的重要瓶頸,以往都是服務端開發在客戶端發版前發佈線上,發佈耗時長,回滾成本高,因此通過引入FaaS,希望提高服務端開發的靈活性,讓開發者更多的面向業務邏輯而不是花較大量的時間在服務的部署維護上面。

image

優酷內部的內容分發目前主要在統一的內容搭建投放框架之上開發,這套框架是一套流程編排的框架,通過流程編排,從不同數據源獲取內容,通過業務邏輯處理,最終通過模版字段映射輸出API內容。目前FaaS主要應用在數據源及模版字段映射階段。數據源即原始數據接口的封裝,通過數據源獲取實際業務需要的原始數據,比如媒資節目視頻、節目專題數據、用戶關注等業務數據;模版字段映射主要通過編寫Java的函數根據實際業務邏輯生成字段內容。以往的開發模式下,如果業務邏輯有變化,需要變更然後發佈Java應用才能生效,採用FaaS開發之後,只需要發佈對應的FaaS函數即可,由於FaaS函數的發佈是秒級,因此極大的提高了迭代效率。

1 統一的數據源封裝

我們使用FaaS實現數據源接口的封裝,當有新的數據接口需要接入時,直接在FaaS平臺上通過編寫函數實現,可以做到在本地Java應用不發佈的情況下,直接上線新數據源。對於新業務接口的快速接入具有重要意義。同時這些數據源可以被重用,因此在多人協作的模式下,通過複用函數實現的數據源極大的減少了重複開發量。

image

2 FaaS函數處理API協議模版字段映射

image

我們擴展了搭投框架,通過Faas的SDK,服務端接口的模版解析階段除了能解析普通的Java函數,也可以支持解析FaaS函數,這類函數的代碼不是通過原生Java代碼編寫,而是在Faas平臺上用Groovy代碼編寫而成,這類函數的特點是編寫、更新、發佈均不需要重新部署哥倫布業務應用,只需要在Faas平臺上操作函數即可。字段邏輯的修改可以完全不用重啓Java應用,快速應對迭代變更。每個函數都有獨立的生命週期和發佈流程,不同函數的發佈變更之間相互隔離。當有字段邏輯的變化時,可以完全不重啓本地Java應用,直接通過函數的秒級發佈來完成,極大提高了迭代效率。

四 總結與展望

目前優酷內容分發相關業務已經陸續引入FaaS能力,在FaaS的助力下,迭代效率提升。但是平臺整體上還處於剛剛起步階段,也是我們Serverless實踐的初步嘗試。後續我們希望在以下幾個方面繼續探索FaaS平臺的技術與落地:

  • 支持更多編程語言的運行時環境,以及更友好的雲端IDE開發體驗。
  • 優化函數運行集羣的資源調度策略,合理分配函數執行需要的資源,支持動態擴縮容。
  • 結合內容分發業務的特點,尋找更多業務的切入點,通過FaaS進一步提升現有技術架構的靈活性和迭代效率。

【雲棲號在線課堂】每天都有產品技術專家分享!
課程地址:https://yqh.aliyun.com/live

立即加入社羣,與專家面對面,及時瞭解課程最新動態!
【雲棲號在線課堂 社羣】https://c.tb.cn/F3.Z8gvnK

原文發佈時間:2020-08-06
本文作者:阿里巴巴文娛技術
本文來自:“阿里技術公衆號”,瞭解相關信息可以關注“阿里技術

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