Cloud Service Engine,簡稱CSE,是中間件部門研發的面向通用Serverless計算的中間件產品,目標是具有AWS Lambda的各類優點,同時能夠解決AWS Lambda的關鍵技術缺陷。java
AWS Lambda若是用於核心業務,可能會有如下缺陷:(僅表明我的觀點)linux
CSE目前在集團內測中,本文非完整產品介紹,Serverless話題涉及範圍極廣,幾乎包含了代碼管理
,測試
,發佈
,運維
,擴容
等與應用生命週期關聯的全部環節。本文主要回答我的在探索這個方向時的思考以及中間件部門正在作的解決方案,目標是儘量讓開發者少改代碼,甚至不改代碼,就能具有AWS Lambda的技術優點。web
AWS對Serverless的定義spring
以上觀點來自AWS官網 連接
AWS 定義的Serverless包含了哪些功能項
我的的補充觀點服務器
我的對Serverless的觀點僅在AWS上補充,AWS的整個方案很是完善,可是沒有解決存量應用如何遷移到Serverless架構,僅僅針對新開發的應用,建議用戶用FaaS方式開發,纔有機會變成Serverless架構。網絡
要將Serverless架構大規模推廣,必需要能有針對存量業務的解決方案。
雲計算歸根結底是一種IT服務提供模式,不管是公共雲仍是專有云(以IT設備的歸屬不一樣分類),其本質都是IT的最終使用者能夠隨時隨地而且簡便快速地獲取IT服務,並以獲取服務的層次分爲IaaS、PaaS、SaaS。目前看IaaS、PaaS都已經作到了按需付費。PaaS甚至作到了按請求付費,如DB,CACHE,MQ等,可是IaaS的付費粒度仍然是時間維度,最快按照小時付費,按照分鐘來交付。數據結構
基於以上現狀,應用的開發維護方式相比傳統IDC模式的開發維護差異還不是很大,而AWS Lambda提供了一種全新的方式,只須要用戶寫業務代碼,提交到雲上,全部和機器容量,可用性,機器爲單位的運維工做所有交給了雲平臺,這種模式極大的放大了雲的彈性價值,真正作到了按需付費。架構
本文試圖提供一種更規模化的解決方案,像AWS Lambda同樣,能繼續放大雲的彈性價值,而且是能夠兼容存量應用。app
當前的在線應用程序具備如下特色框架
基於以上客觀條件,一般作法是提早預約好機器數量來應對任意時刻的流量峯值,假設上述技術參數變爲毫秒級,就有機會將應用程序架構演變成下圖所示方式。
上圖中Service A在調用Service B時,若是B的容量充足,調用成功,若是B容量不足,這時候多是線程池滿,可能直接觸發限流閥值,A會收到一個錯誤碼,A會直接調用資源總控系統
,資源總控系統負責新分配一個Service B實例,這個分配的速度很是快,耗時幾十毫秒,同時把B的服務地址直接返回給A,A將以前未完成的請求發送到新建立的Service B。
以上過程對於開發者徹底透明,具有了如下價值:
價值三:按照請求計費,由於每一個實例的啓動時間甚至比FaaS的函數啓動時間還快,就能夠像FaaS同樣來覈算成本,成本只與如下因素有關
綜上所述:爲了作到以上描述的分佈式架構,關鍵技術點在於
應用啓動速度
,這裏的應用啓動速度是指應用能夠正常處理流量爲止。
應用在啓動過程當中一般會初始化多個組件,如各類中間件,各類數據結構,以及網絡調用外部服務,在阿里內部普遍推廣SOA,微服務狀況下,會大量加載共享業務SDK,會存在啓動過程達到10分鐘量級的狀況,個別應用可能會更長。
所以,這個啓動過程必須提早完成,纔有機會臨陣磨槍的方式去建立新實例。
方案一:應用冷啓動資源壓縮方案
L1彈性能力是指在一臺物理機或者大規格的ECS上部署同一個應用的多個實例,經過操做系統和JVM的優化,一個佔用4G堆內存的應用,即便部署10份,僅需佔用2.2G RAM。以線上菜鳥生產應用爲例。
L1總結來看是一種高密度部署方式,因爲應用已經提早啓動,而且對容器進行凍結,意味着這個應用實例CPU佔用率爲0,RAM佔用至關於以前的1/20,可是具有了毫秒級彈性的能力。L1的特色是啓動速度極快,可是須要消耗資源,且只能垂直彈性。
L2是經過將應用程序啓動後在RAM中的指令和數據結構 dump到磁盤文件,只須要在機器之間拷貝文件便可以達到橫向彈性的能力,這個時間消耗主要是數據的網絡傳輸時間+內存拷貝時間,大約在5秒左右能夠完成。L2的成本開銷只有網絡磁盤容量,開銷極低,可忽略不計。
L2的每一個SNAOSHOT對應一個可運行的實例,例如預計一個應用須要最大啓動100個實例,那麼須要提早生成100個SNAOSHOT,每一個SNAOSHOT對應一個運行實例,須要啓動時,從遠程磁盤加載這個SNAPSHOT。
此方案經過L1和L2的組合來達到加速應用啓動的目的,在支持必定流量脈衝能力下,能夠最大50ms內啓動任意應用,平均在10ms內完成。
方案二:應用熱複製啓動加速方案
L1採用經過fork種子進程達到快速啓動的效果,操做系統團隊專門爲此開發了fork2技術,與linux native fork的關鍵區別是能夠指定PID來fork一個進程
pid_t fork2(pid_t pid);
L2的單個SNAPSHOT能夠建立多個進程,一對多關係。
適合FaaS、盒馬NBF這類場景或者開發者本身定義開發框架,能避免UUID這種狀況的 場景使用。
總體來看,方案一的適用場景更廣,可是實現成本更高,方案二較適合FaaS,NBF這類場景。
與AWS Lambda方案對比
Lambda爲了作到快速擴縮容,要求用戶的應用以Function爲單位開發,Lambda Runtime動態加載Function來快速增長實例。
CSE經過將一個應用的多個實例啓動後,共享相同的指令數據,抽取出不一樣的指令數據,每次啓動實例只須要加載多實例的差別部分。所以能夠透明兼容社區主流技術棧,如Spring Boot,PHP/Java/Python/NodeJS等。
理論模型
Serverless方式應用佔用的實例數隨時在變化,所以能夠多個應用錯峯使用同一臺機器。
量化分析
Serverless的成本優點是能夠和CPU Share&離在線混部等調度技術的成本優點作疊加,能給最終用戶一個更優的整體成本。
HSF demo
package com.test.pandora.hsf; import com.alibaba.boot.hsf.annotation.HSFProvider; @HSFProvider(serviceInterface = HelloWorldService.class) public class HelloWorldServiceImpl implements HelloWorldService { @Override public 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 ignored return "Still surviving."; } public static void main(String[] args) { SpringApplication.run(HelloworldApplication.class, args); } }
3.8女王節的最新數據,盒馬導購域的P0級服務流量峯值從4000+瞬間飆到12萬,CSE瞬間彈性擴容,從2臺-->5臺-->10臺,流量峯值回落後又縮容到2臺。
fork2技術
,感謝 @啓翾 @喻望 @笑哲APPCDS技術
,感謝 @三紅 @傳勝 @QI, Yumin @在弦本文爲雲棲社區原創內容,未經容許不得轉載。