阿里自研開源框架 Midway Serverless ,如何讓前端提效 50%?

去年開始,阿里前端及阿里的多個團隊聯合開始了一項“祕密”任務,使用 Serverless 這一新一代研發架構,希望能大量減少研發人員使用基礎設施和運維的成本。目前這一框架已經實現前端提效 50%,且已在 Github 開源,開源地址見鏈接

Midway Serverless

Midway 之前是傳統的 Web 棧框架,和業界現有的 EggJS,NestJS 等解決的是類似的問題,從中後臺到移動端應用,前端都廣泛採用了這些框架來構建自己的業務系統。阿里也不例外,Node.js 應用非常多,但是這些系統有一個共性,大多數服務器的 CPU 使用率非常低,這無疑是一種資源的巨大浪費。

這種資源浪費的常態以及應用的規模化幾何倍數的增產,讓應用治理的人員頭疼不已。於是,阿里把目光轉向 Serverless 架構,他們開始去思考,如何有效去減少研發人員使用基礎設施的效率和運維的成本。

Serverless 和 FaaS

FaaS 是 Serverless 架構的其中一種形態,也是這次 Midway 希望解決的場景。在Midway Serverless 1.0 之前,我們在 FaaS 上投入了許多,但是事實上,Serverless 架構非常龐大,FaaS 只是其中的一小部分,基於事件驅動的模型,從微服務(MicroService)這種專注於單一職責與功能的小型功能塊演進而來。如今這種更加“代碼碎片化”的軟件架構範式,相比微服務更加細小的程序單元,給業務代碼提供了無與倫比的靈活性。

按照《福布斯》雜誌的統計,在商業和企業數據中心的典型服務器僅提供 5%~15% 的平均最大處理能力的輸出,這無疑是一種資源的巨大浪費。而隨着 Serverless 架構的出現,讓服務提供商提供我們的計算能力最大限度滿足實時需求,這將使我們能更有效地利用計算資源。

阿里目前使用了 FaaS 來作爲業務的落地容器,希望能進一步減少容器的規格,降低成本。集團機器的成本當前是按 CPU Core 算的,以 4C8G(4核8G)的機器爲例,一箇中後臺應用最少需要 2 臺機器,而上了 FaaS,能減少到 1C,乃至 0.5C,這個成本下降的非常可觀。

落地前端

在阿里“大中臺小前臺”的趨勢下,前端是最接近用戶且活力迸發的團隊。前端一直希望能夠有機會擺脫“資源”的困境,對整體工種的職能、邊界有更廣泛而清晰的拓展需求,造就瞭如今前端的範圍不斷衍生,從端側到智能化,無一不是職能擴大的體現。

對前端開發者而言,Node.js 賦予了開疆拓土的能力,自前後端分離開始,從端到全棧,Node.js 已經成爲前端學習的標配,而 DevOPS 的提出,也讓前端逐步走向開發自治,運維自驅的路子。而阿里在實際實踐中發現,大部分前端的確在朝着那個方向走,但是更多的是在業務和自治之間產生了一些迷惘,這兩者的關係其實很不容易平衡,時間一久也會對業務的規模化產生一些影響。

而 Serverless 的出現,正好讓前端有機會減少整個 OPS 環節,更加聚焦於業務本身;同時,由於整體的代碼量減少以及輕量化開發理念、部署平臺能力的增強,讓整個業務的規模化成本越來越低。

之前,有人把 Serverless 比作前端的 3.0,這不無道理。Node.js 的輕量、快速已經得到了業界技術人員的廣泛認可,在 Serverless 時代,容器的快速調度、代碼的快速啓動,都是非常重要的指標,而 Node.js 在這方面的優勢非常明顯。

前端提效 50%

這個數值在我們看來,Serverless 帶來的效能變化的數值可能更大。其中分爲規模化成本交付速度兩個方面。

降低規模化成本

首先是服務器成本

從容器本身的角度來看,上文已經簡單演算過,從傳統容器到函數,整個容器資源從固定規格到更加細粒度的規格去逐步演進,這將更加符合場景的訴求。經過我們一年的跟蹤,中後臺應用的機器成本能降低 70% 以上,而實際移動端業務,也達到了 30% 左右。

其次是治理成本

越是大的公司,歷史包袱越是嚴重,今年的阿里集團內部,還存留着 Node.js V6 乃至 V4 的代碼。每年的 Node.js 版本升級、框架升級、庫升級都要至少長達幾個月,甚至幾年。

而如今,函數運行時(Runtime)是前端自己編寫的,我們可以將需要治理的 Node.js 版本、框架,乃至中間件都埋入其中,這就需要定製整個運行時及其通用化的能力。

阿里的內的函數服務有多種,提供了不一樣的基建和網關服務。今天淘系前端能夠使用一套代碼部署在不同的平臺之上,就得益於 Midway Sererless 底層的多平臺適配能力。同時,這套代碼的防腐層能力也正好能抹平社區的平臺差異性。

針對每個平臺,Midway Serverless 提供了不同的運行時啓動器,用於抹平各個平臺的差異,並且通過這些啓動器,將各個平臺的出入參,以及各個 event 結構,網關的返回格式進行規則化,讓用戶儘可能不感知底層容器以及協議的差異。

阿里通過這套方案,將一套代碼部署在不同的函數服務之上,提供出不同協議的服務。所以到社區,阿里開源的方案也同樣適用於多個平臺,比如阿里雲、騰訊雲或者是未來的 AWS Lambda、Azure 等。

經過這層防腐和定製,整個運行時的更新變的簡單,將傳統應用需要半年起的版本推平工作,在短短一週內就完成了。舉個例子,底層有個和平臺的連接協議庫有安全性漏洞,從接到安全報告開始,我們就需要做以下兩件事,一是從平臺數據拉取受影響的函數範圍,給所有業務方進行了安全性郵件推送,並告知在一定時間之內不做主動申報的,將默認統一自動更新。二是在流量低谷期進行滾動更新,並以告知業務及時關注和測試。經過這樣的流程,整個安全性更新在極短的時間內就統一處理完畢,這在以往的應用場景下,幾乎是不可能的。

最後是安全生產成本,這塊在阿里內部的訴求較大,但是中小型公司應該不多,這裏就不再詳述了。

通過這三塊的管控和治理,使得在 Serverless 架構下,集團業務規模化成本極速降低。

交付速度

除了規模化成本外,另外一塊就是業務交付的情況。前端面向的移動端和中後臺兩大場景都需要快速的交付,以現在的情況來看,前端依舊是研發的瓶頸,在使用了 Serverless 之後,原有的複雜流程已經無法滿足現有的訴求。

去年我們團隊在 GMTC 及 D2 分享中說過,前端自建了一套研發流程和平臺,用於滿足在新的場景的測試、灰度和回滾。整個研發流程,節點比以往更少,更容易聚焦。

而另一邊,整個研發的效率,也有了不小的提升。

前端開發的效率,得益於前後端的融合,一體化開發和交付的速度。傳統的前端研發,需要在前端倉庫和 Node.js 端倉庫多處進行開發,發佈流程也是分離的。而在 Serverless 場景下,Midway Serverless 設計了一體化開發和發佈的方案,這讓前端能將業務在同一個倉庫開發,同一個流程發佈。特別是那些維護多業務的同學,感觸會更深。

除了一體化的開發、調試,部署之外,從代碼角度看,原有的編碼習慣被保留,無需再度學習新的編程 API 也是一個方面。Midway Serverless 除了提供基於 TypeScript 和裝飾器的編碼風格之外,也提供了一些傳統應用 Egg 應用遷移的方案,在不同的 BU 中也進行了落地嘗試,效果非常不錯。

經過一年我們在平臺測的統計和業務開發方的走訪,新的研發模式對業務整體的交付效率有一定的提升,這個提升是普適性的。

以前端完成需求爲例,傳統完成業務需求需要後端的介入以及聯調,而新的研發模式在代碼層面會開發更快,雖然單人來看工作量增加了,但是整體的交付時間,投入人員以及聯調成本都有明顯的降低。

除了業務感性的交付數據外,我們還統計了整體的研發代碼量,提交的代碼頻次以及需求的迭代週期和發佈。經過一年業務跟蹤和數據的測算,我們得出整體前端人效的提升約爲 48%,整個核心的算法牽扯到很對內部的數據,抱歉無法提供,歡迎大家入職觀摩。

Serverless 的弊端

任何事物都有兩面性。Serverless 優勢固然的大,但是畢竟是新東西,特別是在企業中落地的時候,難免會遇到一些問題。

一是基建的缺失,傳統的各種客戶端、日系投遞、鏈路追蹤等能力都非常的完善,而函數這些新的事物還需要時間逐步沉澱,加上彈性容器的影響,整個鏈路都還是新生事物,需要時間去驗證穩定性和可靠性。

二是業務同學的整體理念還是停留在傳統應用的層面,對函數的運作機制,事件觸發的行爲了解不深,加上框架做了很多屏蔽的工作,很容易出現某些代碼編寫錯誤或者前期需求評估不到位,能力無法實現的情況。這些都需要慢慢的打磨,相信在不斷的實踐下,整體都會越變越好。

最後

我們可以看到,50% 的計算方式是一個相對感性的數字,但是 Serverless 在其中實實在在的體現出了它的魅力和價值。最後慶祝一下 Midway Serverless v1.0 發佈。通過整個 Midway Serverless 新體系,我們將阿里的 Serverless 能力逐步開放,希望整個前端能有不同的思路去承擔更大的業務職能,進入一個嶄新的時代。

活動推薦
最近,由於疫情影響,我們準備了 QCon+ 線上體驗,歡迎圍觀。

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