Serverless 話題涉及範圍極廣,幾乎包含了代碼管理、測試、發佈、運維和擴容等與應用生命週期關聯的全部環節。AWS Lambda 是 Serverless 領域的標誌性產品,但若是將其應用於核心業務,可能會遇到如下難題:(僅表明做者我的觀點)首度揭祕: java
本文將介紹阿里雲中間件團隊在探索 Serverless 過程當中的思考以及正在作的事,目的是儘量讓開發者少改代碼,甚至不改代碼,就能具有 AWS Lambda 的技術優點。
Cloud Service Engine 雲服務引擎(如下簡稱CSE),是阿里雲中間件團隊開發的面向通用 Serverless 計算的中間件產品,目的是具有 AWS Lambda 的各類優點,同時能夠解決用戶在使用 AWS Lambda 時遇到的難題。web
AWS 對 Serverless 定義是:(摘自 AWS 官網)
spring
AWS 無服務器平臺提供的功能:(摘自 AWS 官網)服務器
AWS 的整套 Serverless 方案很是完善,可是沒有解決存量應用如何遷移到 Serverless 架構的問題。僅僅是針對新開發的應用,建議用戶使用 FaaS 方式開發,纔有機會轉向 Serverless 架構。筆者認爲,要將 Serverless 架構大規模推廣,必需要能有針對存量業務的解決方案。網絡
雲計算,歸根結底是一種 IT 服務提供模式,不管是公共雲仍是專有云(以IT設備的歸屬不一樣分類),其本質都是幫助 IT 的最終使用者隨時隨地,而且簡便快速地,獲取 IT 服務,目前,IaaS、PaaS都已經作到了按需付費,PaaS 甚至作到了按請求付費,如DB,CACHE,MQ等,可是 IaaS 的付費粒度仍然是時間維度,最快按照小時付費,以分鐘來交付。
所以,當下的雲計算場景,應用的開發維護方式相比傳統 IDC 時代的開發維護,差異還不是很大。但 AWS Lambda 提供了一種全新的開發維護方式,用戶只須要寫好業務代碼,提交到雲上,全部和機器容量、可用性、機器爲單位的運維工做能夠所有交給了雲平臺,這種模式極大的釋放了雲的彈性價值,真正作到了按需付費。
CSE 試圖提供一種更規模化的解決方案,像 AWS Lambda 同樣,能進一步釋放雲的彈性價值,而且能夠平滑遷移存量應用。數據結構
存量在線應用程序具備如下特色架構
基於以上客觀條件,一般作法是提早預約好機器數量來應對任意時刻的流量峯值,假設上述技術參數變爲毫秒級,就有機會將應用程序架構演變成下圖所示方式。app
上圖中,Service A 在調用 Service B 時,若是 B 的容量充足,則調用成功;若是 B 的容量不足,這時候若是線程池滿,則直接觸發限流閥值,A 會收到一個錯誤碼,而後直接調用資源總控系統,資源總控系統負責新分配一個 Service B 實例,這個分配的速度很是快,耗時幾十毫秒,同時把 B 的服務地址直接返回給 A,A 會將以前未完成的請求發送到新建立的 Service B。
以上過程對於開發者徹底透明,具有了如下價值:框架
價值三:按照請求計費;由於每一個實例的啓動時間甚至比 FaaS 的函數啓動時間還快,就能夠像 FaaS 同樣來覈算成本,成本只與如下因素有關less
綜上所述:爲了作到以上描述的分佈式架構,關鍵技術點在於應用啓動速度,這裏的應用啓動速度是指應用能夠正常處理流量爲止。
應用在啓動過程當中一般會初始化多個組件,如各類中間件、數據結構,以及網絡調用外部服務。在阿里內部普遍使用 SOA 和微服務的狀況下,應用在啓動過程當中會大量加載共享業務 SDK,存在啓動過程達到10分鐘量級的狀況,個別應用可能會更長。所以,這個啓動過程必須提早完成,纔有機會以「臨陣磨槍」的方式去建立新實例。
L1 採用經過 fork 種子進程達到快速啓動的效果,操做系統團隊專門爲此開發了 fork2 技術,與 Linux Native fork 的關鍵區別在於能夠指定 PID 來 fork 一個進程。
pid_t fork2(pid_t pid);
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); } }
某電商業務 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臺實例之間波動。
原文連接 本文爲雲棲社區原創內容,未經容許不得轉載。