多語言支持、事件驅動的全托管Serverless函數計算服務平臺 — iPaaS·EasyFunction
作者 | 朱志國、汪智群、趙涵、戴文龍等,來自平臺業務研發部-應用業務產品研發部通天塔團隊。
?寫在前面
Serverless是目前比較熱門的技術話題,各大云平臺以及互聯網大廠內部都在積極建設Serverless產品。本文將介紹iPaaS(京東前端一體化搭建平臺)體系下的 Serverless FaaS產品EasyFunction平臺的功能和落地情況,具體分為兩個部分,第一部分通過介紹FaaS適用的場景、可帶來的收益來說明我們為什么要做EasyFunction以及它可以給我們帶來哪些收益,第二部分通過EasyFunction的產品功能、典型落地案例的介紹來深入了解EasyFunction。通過閱讀希望可以給大家帶來一些啟發和幫助。
背景
近些年Serverless技術迅速發展,國內各大互聯網公司都在積極建設Serverless相關產品,探索Serverless技術的落地,國內阿里云、騰訊云等都有相應商業化的產品。在這種大的背景下,通天塔團隊結合自身的需求和支撐IPaaS技術開放體系需要,在去年9月份經過調研后,開始了Serverless FaaS平臺的建設,內部項目名稱為EasyFunction。用一句話概括EasyFunction即一種基于 Java、NodeJs、Go等多語言功能函數即服務 (FaaS) 的編程平臺,幫助用戶脫離繁冗的開發配置、申請機器資源等運維工作,開發者只需要關注業務代碼邏輯的編寫實現。目前我們處于快速驗證,落地MVP版本階段,我們通過技術選型、產品與架構設計、開發迭代,已經快速落地了Serverless FaaS產品的基本的能力,如構建、發布、彈性伸縮、對接觸發源、執行函數等。目前正在推進了一些業務的試點接入,幫助驗證打磨產品。
適用場景
01BFF(Backend For Front)場景
BFF層,主要職責把相對底層的領域對象數據通過聚合、裁剪轉換成前端視圖層的數據,這里的視圖層數據會因端上的場景和設備而異,經常要做一些個性化處理。而對于視圖層數據模型前端開發最為清楚和熟悉,知道需要什么樣的數據來渲染頁面。在傳統的開發模式中會導致后端相似功能的聚合接口林立,而且大部分接口生命周期都很短(業務試錯原因),開發階段前后端溝通成本、后期維護成本、機器資源成本都比較大。而使用FaaS支持多種語言的函數開發,降低開發門檻,開發者在編寫函數時只需關注業務邏輯的實現,就可以完成API編寫、發布、上線,這樣一來前端同學就可以實現數據層的自管理,減少前后端溝通成本。
02數據處理&定時任務場景
FaaS平臺直接與任務調度系統、JMQ打通,開發者只需關注任務的處理邏輯編寫,然后創建相應類型的函數觸發器,就可以完成定時任務的接入,而不需要管理機器資源,同時可以根據實時流量或者實例CPU負載進行資源的自動伸縮,資源按需使用。
03SSR(服務端渲染)場景
在服務端完成數據和樣式的綁定,返回html數據,這種比較耗后端資源,但好處是頁面可以快速展現,所以這塊可以嘗試在FaaS中寫,尤其前端首屏快速展現場景。
04后臺管理平臺場景
公司內部有很多的后臺管理平臺的Web服務,它們雖然相較于函數是比較重的,但完全可以直接托管Serverless平臺,充分享受Serverless平臺極致的發布和運維效率。
帶來的業務收益
將傳統應用和FaaS云函數進行個簡單地對比:
- "統一" 了業務組間的業務實現方式,業務切換快
- 消除服務端技術壁壘,可以使用熟悉的技術棧做業務邏輯開發
- 對用戶 ”無框架“ 概念,用戶只需要了解函數的輸入和輸出
- 從部署、發布、監控 “一條龍” 式的平臺服務,高效、穩定
不管是在資源利用率還是研發運維效率上,FaaS都給我們帶來了諸多好處。
產品功能
EasyFunction-云函數底層k8s運維、機器資源編排托管于京東云,而我們則專注于FaaS產品上層功能的建設,比如網關功能建設、一站式平臺開發、函數模板開發等,目前已經快速落地了Serverless FaaS產品的基本的能力,如構建、發布、彈性伸縮、對接觸發源、執行函數,具體功能如下:
01函數創建
EasyFunction支持Java8、NodeJs14、Go、Python、PHP、Ruby六種語言的函數創建,其中Java8語言的函數生態最為豐富,集成了集團主流中間件(JSF、Ducc、JMQ、ClickHouse、UMP等),其次是NodeJs,如果大家感興趣加入我們一起共建函數語言模板,豐富函數生態。
開發者選擇好語言完成創建函數,下載對應函數模板代碼,上傳到Coding,在函數基本配置信息中配置函數倉庫地址、選擇函數實例CPU、內存配置、配置環境變量即完成函數創建。
02版本&路由
在完成函數創建后,進入函數代碼編寫、測試、發布版本階段。具體語言的函數代碼編寫指南參照開發手冊文檔同時在開發工具上EasyFunction集成了CloudIDE,輕松實現WEB端編碼。我們也提供了在線函數測試功能。
經過部署、測試后,可對當前LATEST版本進行發版,發布一個新的版本可以理解為為 LATEST 版本的函數代碼和函數配置(不包括觸發器)創建一個快照副本。針對發布的版本開發者可以實時查看日志、重啟、調整副本實例。
在首次完成版本發布后,建議開發者創建對應的別名,使用別名訪問服務或函數時,EasyFunction會將別名解析為其指向的版本,調用方無需了解別名指向的具體版本,同時開發者可自由的調整別名下所管理版本的流量比例。
03觸發器
觸發器是觸發函數執行的方式。在事件驅動的計算模型中,事件源是事件的生產者,函數是事件的處理者,只有創建了對應的觸發器,外部事件才可以通過觸發器的具體方式訪問到函數。EasyFunction支持HTTP、Color網關、JMQ三種類型的觸發器,其中HTTP在公司內網系統間調用使用、Color網關用于外網事件源觸發函數。
04自動伸縮
EasyFunction目前支持根據CPU負載和單實例QPS兩種類型的指標觸發伸縮,在高流量場景下單一指標的短暫性抖動會導致伸縮頻繁不穩定的問題,后續我們將基于多負載指標+算法預測作為觸發伸縮的依據同時增加定時伸縮功能。不過當前的單一指標伸縮在一些流量穩定且有一定規律的場景下預期也是比較好。下圖是線上一個函數的案例函數實例數基本上隨著QPS的增長而伸縮,在凌晨4點時刻由于流量達到最低,實例副本數也降到最低2個。
模擬數據
05日志&監控
EasyFunction提供了在線函數日志檢索和函數一些基本指標的監控。
落地案例
在完成MVP版本的上線后,目前已經推進了一些業務的接入,下面介紹幾個典型案例。
1、水滴cms和EasyFunction結合,幫助開發者快速高效的搭建cms
水滴cms搭建平臺負責頁面的樣式的搭建和數據渲染、FaaS提供cms所需的數據,這個數據開發者可自行通過創建函數、編寫函數來定義,且EasyFunction支持多語言,免運維的特點,降低開發者開發門檻的同時讓開發者只需要關注業務邏輯的實現即可快速發布一個函數為cms提供自定義的數據。
2、營銷中心資源位接口案例(BFF場景)
提供在線的,以 API 為管理維度的聚合類 API是典型的BFF場景。營銷中心系統的宗旨之一是打造中心化工作平臺,整合內部垂直平臺能力,所以經常需要編排處理多個外部平臺的接口數據,然后返回符合營銷中心cms前端樣式要求的數據。此種場景下開發者通過在函數中編排已有其他平臺的JSF或者HTTP類型的接口,快速構建發布函數,而不需要考慮機器資源申請、域名申請等運維問題。
3、通天塔日志分析函數(數據處理場景)
通天塔核心系統日志MQ流量會隨著業務請求流量的上升而上升,之前是在后端管理平臺上處理日志分析的邏輯,經常會遇到流量高峰時日志處理吞吐量不足進而導致監控大盤顯示延遲的問題,老的辦法只能通過提前預估流量手動擴容后端管理應用的實例來應對。而使用函數來處理,創建JMQ類型的函數觸發器,配置合適的自動伸縮策略就可以很好的解決以上問題。
未來規劃
接下來我們將會從優化核心技術,保障業務穩定性;完善生態,落實收益方向上去推進。實踐方向上我們會針對前面說的4大適用場景上去落地案例,真正做到降本增效。下一期我們將會詳細介紹EasyFunction底層架構設計和核心技術原理。