Serverless 話題涉及範圍極廣,幾乎包含了代碼管理、測試、發佈、運維和擴容等與應用生命週期關聯的全部環節。在線應用如何不改代碼也能遷移到 Serverless 架構?今天,咱們來揭祕阿里巴巴成千上萬在線應用的Serverless 演進過程。java
AWS Lambda 是 Serverless 領域的標誌性產品,但若是將其應用於核心業務,可能會遇到如下難題:(僅表明做者我的觀點)web
Cloud Service Engine 雲服務引擎(如下簡稱CSE),是阿里雲中間件團隊開發的面向通用 Serverless 計算的中間件產品,目的是具有 AWS Lambda 的各類優點,同時能夠解決用戶在使用 AWS Lambda 時遇到的難題。spring
AWS 對 Serverless 定義是:服務器
AWS 無服務器平臺提供的功能:網絡
AWS 的整套 Serverless 方案很是完善,可是沒有解決存量應用如何遷移到 Serverless 架構的問題。僅僅是針對新開發的應用,建議用戶使用 FaaS 方式開發,纔有機會轉向 Serverless 架構。筆者認爲,要將 Serverless 架構大規模推廣,必需要能有針對存量業務的解決方案。數據結構
雲計算,歸根結底是一種 IT 服務提供模式,不管是公共雲仍是專有云(以 IT 設備的歸屬不一樣分類),其本質都是幫助 IT 的最終使用者隨時隨地,而且簡便快速地,獲取 IT 服務,目前,IaaS、PaaS 都已經作到了按需付費,PaaS 甚至作到了按請求付費,如 DB,CACHE,MQ 等,可是 IaaS 的付費粒度仍然是時間維度,最快按照小時付費,以分鐘來交付。架構
所以,當下的雲計算場景,應用的開發維護方式相比傳統 IDC 時代的開發維護,差異還不是很大。但 AWS Lambda 提供了一種全新的開發維護方式,用戶只須要寫好業務代碼,提交到雲上,全部和機器容量、可用性、機器爲單位的運維工做能夠所有交給了雲平臺,這種模式極大地釋放了雲的彈性價值,真正作到了按需付費。app
CSE 試圖提供一種更規模化的解決方案,像 AWS Lambda 同樣,能進一步釋放雲的彈性價值,而且能夠平滑遷移存量應用。框架
存量在線應用程序具備如下特色:less
基於以上客觀條件,一般作法是提早預約好機器數量來應對任意時刻的流量峯值,假設上述技術參數變爲毫秒級,就有機會將應用程序架構演變成下圖所示方式。
上圖中,Service A 在調用 Service B 時,若是 B 的容量充足,則調用成功;若是 B 的容量不足,這時候若是線程池滿,則直接觸發限流閥值,A 會收到一個錯誤碼,而後直接調用資源總控系統,資源總控系統負責新分配一個 Service B 實例,這個分配的速度很是快,耗時幾十毫秒,同時把 B 的服務地址直接返回給 A,A 會將以前未完成的請求發送到新建立的 Service B。
以上過程對於開發者徹底透明,具有了如下價值:
綜上所述:爲了作到以上描述的分佈式架構,關鍵技術點在於應用啓動速度,這裏的應用啓動速度是指應用能夠正常處理流量爲止。
應用在啓動過程當中一般會初始化多個組件,如各類中間件、數據結構,以及網絡調用外部服務。在阿里內部普遍使用 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 一個進程。
L2 的單個 SNAPSHOT 能夠建立多個進程,一對多關係。
總體來看,方案一的適用場景更廣,可是實現成本更高,方案二較適合 FaaS、NBF 這類場景。
Lambda 爲了作到快速擴縮容,要求用戶的應用以 Function 爲單位開發,Lambda Runtime 動態加載 Function 來快速增長實例。
CSE 則經過將一個應用的多個實例啓動後,共享相同的指令數據,抽取出不一樣的指令數據,每次啓動實例只須要加載多實例的差別部分。所以能夠透明兼容社區主流技術棧,如 Spring Boot,PHP/Java/Python/Node.JS 等。
理論模型:
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); } }
CSE 的生產實踐
某電商業務 A:Serverless 化後,機器數量從11臺下降到2臺(2~10臺之間波動),某促銷節,服務流量峯值從數千瞬間飆到十多萬,CSE 瞬間彈性擴容,從2臺-->5臺-->10臺,流量峯值回落後又縮容到2臺。
某電商業務 B:Serverless 化後,機器數量從4臺到2臺(2~10臺之間波動)。
某電商業務 C:以前固定4臺機器,Serverless 化完成後,機器數量變成1臺(1~4臺之間波動),預發可實現0 - 1臺實例之間波動。
原文連接 本文爲雲棲社區原創內容,未經容許不得轉載。