阿里巴巴在 Serverless 计算领域的探索
來源:阿里巴巴中間件
Serverless 話題涉及范圍極廣,幾乎包含了代碼管理、測試、發(fā)布、運維和擴容等與應(yīng)用生命周期關(guān)聯(lián)的所有環(huán)節(jié)。AWS Lambda 是?Serverless 領(lǐng)域的標志性產(chǎn)品,但如果將其應(yīng)用于核心業(yè)務(wù),可能會遇到以下難題:(僅代表作者個人觀點)首度揭秘:?
-
要求用戶以 Function 為單位進行開發(fā),全新的開發(fā)框架,云廠商強綁定,社區(qū)主流技術(shù)棧遷移成本高;
-
Function 啟動速度要足夠快,毫秒級或者秒級,這個限制對適用場景有很強的約束;
-
Function 之間的調(diào)用通過 API Gateway,響應(yīng)時間更長。
本文將介紹阿里云中間件團隊在探索?Serverless 過程中的思考以及正在做的事,目的是盡可能讓開發(fā)者少改代碼,甚至不改代碼,就能具備 AWS Lambda 的技術(shù)優(yōu)勢。
Cloud Service Engine 云服務(wù)引擎(以下簡稱CSE),是阿里云中間件團隊開發(fā)的面向通用 Serverless 計算的中間件產(chǎn)品,目的是具備 AWS Lambda 的各種優(yōu)勢,同時可以解決用戶在使用 AWS Lambda 時遇到的難題。
什么是 Serverless
AWS 對?Serverless 定義是:(摘自 AWS 官網(wǎng))
AWS 無服務(wù)器平臺提供的功能:(摘自 AWS 官網(wǎng))
AWS 的整套 Serverless?方案非常完善,但是沒有解決存量應(yīng)用如何遷移到 Serverless 架構(gòu)的問題。僅僅是針對新開發(fā)的應(yīng)用,建議用戶使用 FaaS 方式開發(fā),才有機會轉(zhuǎn)向 Serverless 架構(gòu)。筆者認為,要將 Serverless 架構(gòu)大規(guī)模推廣,必須要能有針對存量業(yè)務(wù)的解決方案。
Serverless 對云計算的價值
云計算,歸根結(jié)底是一種 IT 服務(wù)提供模式,不論是公共云還是專有云(以IT設(shè)備的歸屬不同分類),其本質(zhì)都是幫助 IT 的最終使用者隨時隨地,并且簡便快速地,獲取 IT 服務(wù),目前,IaaS、PaaS都已經(jīng)做到了按需付費,PaaS 甚至做到了按請求付費,如DB,CACHE,MQ等,但是 IaaS 的付費粒度仍然是時間維度,最快按照小時付費,以分鐘來交付。
因此,當下的云計算場景,應(yīng)用的開發(fā)維護方式相比傳統(tǒng) IDC 時代的開發(fā)維護,差別還不是很大。但 AWS Lambda 提供了一種全新的開發(fā)維護方式,用戶只需要寫好業(yè)務(wù)代碼,提交到云上,所有和機器容量、可用性、機器為單位的運維工作可以全部交給了云平臺,這種模式極大的釋放了云的彈性價值,真正做到了按需付費。
CSE?試圖提供一種更規(guī)模化的解決方案,像 AWS Lambda 一樣,能進一步釋放云的彈性價值,并且可以平滑遷移存量應(yīng)用。
存量在線業(yè)務(wù)實現(xiàn)?Serverless 架構(gòu)的挑戰(zhàn)
存量在線應(yīng)用程序具有以下特點
-
資源分配速度 = 分鐘級
-
應(yīng)用程序啟動速度 = 10分鐘+
基于以上客觀條件,通常做法是提前預(yù)定好機器數(shù)量來應(yīng)對任意時刻的流量峰值,假設(shè)上述技術(shù)參數(shù)變?yōu)楹撩爰?#xff0c;就有機會將應(yīng)用程序架構(gòu)演變成下圖所示方式。
上圖中,Service A 在調(diào)用 Service B 時,如果 B 的容量充足,則調(diào)用成功;如果 B 的容量不足,這時候如果線程池滿,則直接觸發(fā)限流閥值,A 會收到一個錯誤碼,然后直接調(diào)用資源總控系統(tǒng),資源總控系統(tǒng)負責新分配一個 Service B 實例,這個分配的速度非常快,耗時幾十毫秒,同時把 B 的服務(wù)地址直接返回給 A,A 會將之前未完成的請求發(fā)送到新創(chuàng)建的 Service B。
以上過程對于開發(fā)者完全透明,具備了以下價值:
-
價值一:無需管理服務(wù)器,即無需容量評估;容量評估這件事情對于應(yīng)用負責人一直是一個極難解的問題,因為我們很難預(yù)測未來的峰值是什么。
-
價值二:持續(xù)擴展;之前的做法是每個應(yīng)用程序獨占一定數(shù)量的資源,如果變成Serverless 模式,所有應(yīng)用程序可以共享資源池,每個應(yīng)用程序幾乎可以無限擴展。
-
價值三:按照請求計費;因為每個實例的啟動時間甚至比 FaaS 的函數(shù)啟動時間還快,就可以像 FaaS 一樣來核算成本,成本只與以下因素有關(guān)
-
請求數(shù)量(QPS)
-
每次請求CPU執(zhí)行時間,例如100ms
-
每個實例的內(nèi)存規(guī)格
綜上所述:為了做到以上描述的分布式架構(gòu),關(guān)鍵技術(shù)點在于應(yīng)用啟動速度,這里的應(yīng)用啟動速度是指應(yīng)用可以正常處理流量為止。
如何將應(yīng)用啟動速度提高到毫秒級?
應(yīng)用在啟動過程中通常會初始化多個組件,如各種中間件、數(shù)據(jù)結(jié)構(gòu),以及網(wǎng)絡(luò)調(diào)用外部服務(wù)。在阿里內(nèi)部廣泛使用 SOA 和微服務(wù)的情況下,應(yīng)用在啟動過程中會大量加載共享業(yè)務(wù) SDK,存在啟動過程達到10分鐘量級的情況,個別應(yīng)用可能會更長。因此,這個啟動過程必須提前完成,才有機會以“臨陣磨槍”的方式去創(chuàng)建新實例。
方案一:應(yīng)用冷啟動資源壓縮方案
?
L1 彈性能力是指在一臺物理機或者大規(guī)格的 ECS 上部署同一個應(yīng)用的多個實例,通過操作系統(tǒng)和 JVM 的優(yōu)化,一個占用 4G 內(nèi)存的應(yīng)用,即使部署10份,僅需占用2.2G RAM。
L1 總結(jié)來看是一種高密度部署方式,由于應(yīng)用已經(jīng)提前啟動,并且對容器進行凍結(jié),意味著這個應(yīng)用實例 CPU 占用率為0,RAM 占用相當于之前的1/20,但是具備了毫秒級彈性的能力。L1的特點是啟動速度極快,但是需要消耗資源,且只能垂直彈性。
L2 是通過將應(yīng)用程序啟動后在 RAM 中的指令和數(shù)據(jù)結(jié)構(gòu) dump 到磁盤文件,只需要在機器之間拷貝文件即可以達到橫向彈性的能力,這個時間消耗主要是數(shù)據(jù)的網(wǎng)絡(luò)傳輸時間+內(nèi)存拷貝時間,大約在5秒左右就可以完成。L2 的成本開銷只有網(wǎng)絡(luò)磁盤容量,開銷極低,可忽略不計。
L2 的每個 SNAOSHOT 對應(yīng)一個可運行的實例,例如預(yù)計一個應(yīng)用需要最大啟動100個實例,那么需要提前生成100個 SNAOSHOT,每個 SNAOSHOT 對應(yīng)一個運行實例,需要啟動時,從遠程磁盤加載這個 SNAPSHOT。
此方案通過 L1 和 L2 的組合來達到加速應(yīng)用啟動的目的,在支持一定流量脈沖能力下,可以最大50ms內(nèi)啟動任意應(yīng)用,平均在10ms內(nèi)完成。
方案二:應(yīng)用熱復(fù)制啟動加速方案
L1 采用通過 fork 種子進程達到快速啟動的效果,操作系統(tǒng)團隊專門為此開發(fā)了 fork2 技術(shù),與 Linux Native fork 的關(guān)鍵區(qū)別在于可以指定 PID 來 fork 一個進程。
pid_t fork2(pid_t pid);L2 的單個 SNAPSHOT 可以創(chuàng)建多個進程,一對多關(guān)系。
兩種自研方案的對比
-
方案一:不存在 UUID 問題,但是每種語言的 VM 要單獨定制,成本效果相比方案二略差。
-
方案二:會存在 UUID 問題,若開發(fā)者希望應(yīng)用的每個實例啟動時,都賦值一個 UUID 給一個靜態(tài)變量,但通過 fork 會導(dǎo)致每個實例的這個靜態(tài)變量都相同,這與開發(fā)者預(yù)期不符。方案二的優(yōu)勢是更易實現(xiàn)、和語言無關(guān)、成本效果更優(yōu),適合 FaaS、NBF 這類場景或者開發(fā)者自己定義的開發(fā)框架,能避免 UUID 的問題。
整體來看,方案一的適用場景更廣,但是實現(xiàn)成本更高,方案二較適合 FaaS、NBF 這類場景。
和 AWS Lambda 相比
Lambda 為了做到快速擴縮容,要求用戶的應(yīng)用以 Function 為單位開發(fā),Lambda Runtime 動態(tài)加載 Function 來快速增加實例。
CSE 則通過將一個應(yīng)用的多個實例啟動后,共享相同的指令數(shù)據(jù),抽取出不同的指令數(shù)據(jù),每次啟動實例只需要加載多實例的差異部分。因此可以透明兼容社區(qū)主流技術(shù)棧,如Spring Boot,PHP/Java/Python/Node.JS 等。
CSE 的成本優(yōu)勢
理論模型:
Serverless 方式應(yīng)用占用的實例數(shù)隨時在變化,因此可以多個應(yīng)用錯峰使用同一臺機器。
量化分析:
Serverless 的成本優(yōu)勢是可以和 CPU Share &離在線混部等調(diào)度技術(shù)的成本優(yōu)勢做疊加,能給最終用戶一個更優(yōu)的總體成本。
CSE 的代碼樣例
HSF demo
package com.test.pandora.hsf;import com.alibaba.boot.hsf.annotation.HSFProvider;@HSFProvider(serviceInterface = HelloWorldService.class) public class HelloWorldServiceImpl implements HelloWorldService {@Overridepublic String sayHello(String name) {return "hello : " + name;} }Spring Boot demo
package com.example.java.gettingstarted;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;@SpringBootApplication @RestController public class HelloworldApplication {@RequestMapping("/")public String home() {return "Hello World!";}@RequestMapping("/health")public String healthy() {// Message body required though ignoredreturn "Still surviving.";}public static void main(String[] args) {SpringApplication.run(HelloworldApplication.class, args);} }CSE 的生產(chǎn)實踐
某電商業(yè)務(wù) A:Serverless 化后,機器數(shù)量從11臺降低到2臺(2~10臺之間波動),某促銷節(jié),服務(wù)流量峰值從數(shù)千瞬間飆到十多萬,CSE 瞬間彈性擴容,從2臺-->5臺-->10臺,流量峰值回落后又縮容到2臺。
某電商業(yè)務(wù) B:Serverless 化后,機器數(shù)量從4臺到2臺(2~10臺之間波動)。
某電商業(yè)務(wù) C:之前固定4臺機器,Serverless?化完成后,機器數(shù)量變成1臺(1~4臺之間波動),預(yù)發(fā)可實現(xiàn)0 - 1臺實例之間波動。
總結(jié)
以上是生活随笔為你收集整理的阿里巴巴在 Serverless 计算领域的探索的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何发现 Redis 热点 Key ,解
- 下一篇: Spring Boot Dubbo 应用