Serverless 選型:深度解讀 Serverless 架構及平臺選擇

阿里巴巴雲原生發表於2020-05-15

頭圖.png

作者 | 悟鵬 阿里巴巴技術專家

導讀:本文嘗試以日常開發流程為起點,分析開發者在每個階段要面對的問題,然後組合解決方案,提煉面向 Serverless 的開發模型,並與業界提出的 Serverless 產品形態做對應,為開發者採用 Serverless 架構和服務提供參考。

近兩年來,Serverless 概念在開發者中交流的越來越多,主題分享呈現爆發趨勢,如在雲原生領域頗具影響力 KubeCon&CloudNativeCon 會議中,關於 Serverless 的主題,2018 年有 20 個,到 2019 年增長至 35 個。

在 Serverless 產品層面,從最早的 AWS Lambda,到 Azure Functions、Goolge Functions、Google CloudRun,再到國內阿里雲 Serverless Kubernetes、Serverless 應用引擎、函式計算等,面向計算的 Serverless 雲上基礎設施越來越豐富。

新概念、新產品的產生不是憑空出現,它們誕生之初要解決的是當前問題。隨著實踐者對問題域的理解越來越清晰和深刻,問題的處理方法也會逐步迭代,更接近問題本質的解決方案也會出現。若不從問題域出發來理解解決方案,容易陷入兩個極端,即「它能解決一切問題」和「它太超前了,理解不了」。

從日常迭代看 Serverless

1.png
圖 1

上圖是一個常用的專案迭代模型,其目標是滿足客戶需求。在這個模型中,專案組通過 被動迭代 滿足客戶提出的需求,同時逐步深刻理解客戶需求的本質,通過 主動迭代 和客戶一起採用更好的方案或從根源解決面對的問題。每次的需求反饋會加深對客戶需求的理解,提供更滿足需求的服務。每次的 bug 反饋會加深對處理方案的理解,提供更穩定的服務。

在模型啟動後,日常的核心問題就集中在了 如何加速迭代

如果想要解決迭代加速的問題,就需要了解有哪些制約因素,有的放矢。下述是從開發視角看到的開發模型:

2.png
圖 2

雖然在實際應用中會採用不同的開發語言和架構,但在每個階段均有通用的問題,如:

3.png
圖3

除了要解決上述通用問題,還需要提供標準化的方案,降低開發者的學習和使用成本,縮短從想法到上線的時間。

若將上述過程中不同階段花費的時間做個分析,在專案整個生命週期中會發現:

  • 部署&運維 佔用的時間和精力,會遠大於開發&測試
  • 通用邏輯佔用的時間和精力,會接近甚至超過業務邏輯

為了加速迭代,需要依次解決佔用時間和精力多的部分,如圖 4 所示:

4.png
圖 4

從左至右,通過下放不同層次的運維工作,降低「部署&運維」成本。在降低了運維工作成本後,在「通用邏輯」層面降低成本。二者結合起來,在迭代過程中更深入聚焦業務。該過程也是從 Cloud Hosting 到 Cloud Native 的過程,充分享受雲原生帶來的技術紅利。

由於軟體設計架構和部署架構與當時環境耦合度高,面對新的理念和服務、產品,存量應用迭代過程中採用的技術需要有相應調整,即開發和部署方式需要有一定的改造。對於新應用進行開發和部署時,應用新的理念有一定的學習和實踐成本。

故上述過程不能一蹴而就,需要根據業務當前的痛點優先順序來選擇匹配的服務和產品,並根據未來的規劃提前進行技術預研,在不同的階段選擇適合的服務和產品。

Serverless 簡介

維基百科對於 Serverless 有較為完備的 定義:

Serverless computing is a cloud computing execution model in which the cloud provider runs the server, and dynamically manages the allocation of machine resources. Pricing is based on the actual amount of resources consumed by an application, rather than on pre-purchased units of capacity.

無伺服器計算是一種雲端計算執行模型,雲廠商提供程式執行的伺服器,並動態管理機器資源的分配。雲廠商基於應用程式消耗的實際資源量進行定價,而不是使用者預先購買的容量。

在這種計算模型下,會給使用者帶來如下收益:

Serverless computing can simplify the process of deploying code into production. Scaling, capacity planning and maintenance operations may be hidden from the developer or operator. Serverless code can be used in conjunction with code deployed in traditional styles, such as microservices. Alternatively, applications can be written to be purely serverless and use no provisioned servers at all.

無伺服器計算可以簡化程式碼部署到生產環境的過程,且擴縮容、容量規劃和運維操作可以做到對開發人員透明化。無伺服器程式碼可以與以傳統方式(如微服務)部署的程式碼結合使用,或者,開發者可以按照無伺服器計算的模式編寫應用,完全不用提前配置伺服器.

概念本質上是對問題域的抽象,是對問題域特徵的總結。通過特徵來理解概念,可以避免注意力集中在文字描述而非概念的價值本身。

站在使用者角度,我們可以抽象出 Serverless 的如下特徵:

  • 免運維 (伺服器運維、容量管理、彈性伸縮等)
  • 按資源的使用量付費

在一定規模的公司中,若嚴格區分開發和運維的角色,這種計算形態其實是已經存在的,並非全新的事物。但目前的技術趨勢,是期望藉助雲的規模和技術紅利優勢,通過上雲來降低業務在技術側的成本,並通過技術紅利反哺業務。故業界對於 Serverless 的討論,注意力是集中在雲上的服務和產品所體現的 Serverless 能力。

Serverless 開發模型

Martin Fowler 的 這篇文章站在架構的角度,對 Serverless 開發模型做了充分的闡述,這裡做個簡單的總結,核心圍繞三點:

  • Event-driven 開發模型
  • 自動彈性伸縮
  • OpenAPI

Serverless 開發採用 Event-driven 模型,圍繞 HTTP/HTTPS 請求、時間、訊息等 Event 的生產和響應進行架構設計。在這樣的模型中,Event 的生產、處理流程是核心,通過 Event 驅動整個服務流程,注意力集中在整個處理流程。對業務理解越深刻,Event 型別和業務會越匹配,技術和業務的相互促進作用會越有效。

Event-driven 模型,使得 服務常駐 這種理念從必選項轉變為可選項,可以更好應對業務請求量的變化,如自動彈性伸縮。同時服務非常駐,可以降低所需的資源成本和維護成本,加速專案迭代。

通過 文章的兩幅圖可以更直觀理解:

5.png
圖 5

圖 5 是當前常見的開發模型,Click Processor 服務是個常駐服務,響應來自使用者的所有點選請求。生產環境中,通常會多例項部署, 常駐 是個關鍵特徵,日常的運維重點在確保常駐服務的穩定性方面。

6.png
圖 6

圖 6 是 Event-driven 開發模型,關注重心前移,集中在 Event 的產生和響應方面,響應服務是否常駐是個可選項。

Serverless 在概念上與 PaaS (Platform as a Service)、CaaS (Container as a Service) 的區別,重點是在是否將 自動彈性伸縮 作為概念誕生之初的核心特徵。

結合 Event-driven 的開發模型,Serverless 場景中自動彈性伸縮需要對開發者透明度加深,開發者開發過程對處理能力的關注重心從靜態轉為動態,更好應對上線後業務請求量的不確定性。

在開發方面,交付時可以採用映象,也可以採用語言層面的打包 (如 Java 中的 war/jar) ,由平臺負責執行時相關的工作。還可以更進一步,採用 FaaS 的理念,依託於平臺或標準化 FaaS 解決方案,只提供業務邏輯函式,由平臺負責請求入口、請求呼叫和自動彈性伸縮等執行時事宜。

不論哪種交付方式,在雲上均可以使用 BaaS 的理念,將部分邏輯通過雲平臺或第三方的 OpenAPI 實現,如許可權管理、中介軟體管理等,開發過程中注意力更加聚焦在業務層面。

Serverless 服務模型

Serverless 服務模型關注雲廠商對於 Serverless 計算形態的支援,不同的服務和產品形態主要差異點主要集中在對 Serverless 特徵的理解和滿足程度方面:

  • 免運維 (伺服器運維、容量管理、彈性伸縮等)
  • 按資源的使用量付費

在免運維維度,最基本的是免去伺服器運維成本,開發者可以按量申請資源。在容量管理、彈性伸縮、流量管理、日誌/監控/告警等常規的運維層面,不同的服務和產品會根據自身定位、目標客戶特徵等,有側重採用適合的方式來滿足。

在計費形態方面,雲廠商一方面會根據自身定位確定收費維度,如資源、請求量等,一方面也會根據當前的技術能力確定收費的粒度。

通過上述分析可知,雲廠商不同 Serverless 服務模型不是靜態的,會伴隨產品定位、目標客戶特徵、技術能力等持續迭代,和客戶共同成長。

Serverless 服務模型需要滿足實際需求,再回到圖 4,雲廠商的 Serverless 服務模型可以分為如下幾類:

  • 資源例項平臺
  • 排程平臺
  • 應用管理平臺
  • 業務邏輯管理平臺

綜合起來,即:

7.png
圖7

業界 Serverless 產品

目前國內外雲廠商均提供有不同維度的 Serverless 產品,如下做個簡單的總結:

8.png
圖 8

資源例項平臺

國外 AWS Fargate / Azure ACI、國內阿里雲 ECI / 華為 CCI 影響力較大,對使用者提供容器組服務。容器組作為一個整體,提供類似 Kubernetes 中 Pod 的概念。使用者可以通過 OpenAPI 呼叫直接建立容器組,不用在部署服務前進行伺服器的購買、配置等工作,下放資源相關的容量管理運維工作。使用者可以將資源例項平臺作為容量足夠大的資源池使用,在容器組級別進行細粒度的資源申請,配合動態擴縮容進行應用級別的容量管理。

一般在生產環境中,使用者通常不會直接使用此類資源管理服務,而是藉助應用編排服務,將這類服務透明化,關注重點放在應用編排維度。

排程平臺

Kubernetes 是容器排程的事實標準,國外 AWS EKS、國內阿里雲 Serverless Kubernetes 等一方面託管 Kubernetes Master 元件,一方面藉助資源管理服務,如 VirtualKubelet + AWS Fargate 或 VirtualKubelet + 阿里雲 ECI,提供 Kubernetes Node 層服務。

對於期望直接使用 Kubernetes 能力,同時希望低成本運維 Kubernetes、不保有資源池的使用者,此類產品比較契合需求。

應用管理平臺

國外 Google GAE / CloudRun、國內阿里雲 Serverless 應用引擎等進一步將運維工作服務化,如釋出管理 (打包/灰度/分批/回滾/版本控制等)、日誌/監控/告警、流量管理、彈性伸縮等,使用者可以進一步專注在業務需求,低成本運維。

對於期望零成本改造存量應用、低學習成本使用,又期望最大限度減少運維工作的使用者,此類平臺與需求匹配度較高。但由於應用管理層面的運維工作在業界暫無標準化方案,不同的專案會存在個性化需求,故採用此類產品過程中需要加強溝通,不斷向平臺反饋,通過共建的方式磨合 Serverless 平臺和自身業務。

業務邏輯管理平臺

國外 AWS Lambda / Azure Functions / Google Functions、國內阿里雲函式計算 / 騰訊云云函式 / 華為函式工作流等在應用管理的基礎上,進一步將開發過程中的通用邏輯透明化,使用者僅用關心業務邏輯的實現。這個過程可以類比開發過程中的單元測試編寫過程,輸入、輸出是通用的,僅在處理邏輯存在差異。這類 Serverless 產品也是業界討論最多的形態,代表業界對於理想的開發流程的抽象,可以進一步加快迭代流程,縮短想法到上線的時間。這類 Serverless 產品與雲平臺其他型別的產品整合更緊密,以 BaaS 形態使用雲平臺的服務實現通用邏輯,如儲存、快取等,對雲平臺產品豐富度有一定隱性需求。

處理過程對外部依賴較少或偏計算類的場景,如前端、多媒體處理處理等,採用此類 Serverless 產品學習和使用成本相對低,易於上手。隨著服務、元件的抽象程度越來越高,會有越來越多的業務場景適用,使用者的運維工作會更為透明化,同時開發過程中可以直接享受到業界的最佳實踐,服務的穩定性、效能、吞吐等方面藉助平臺的能力做到最大化。

選型

綜上,使用者在進行 Serverless 產品選型時,需要先整理當前業務技術所處的階段和痛點,確定對雲上方案的需求,然後再根據雲廠商的產品形態做對應,選擇適合當前階段的服務和雲產品。

該對應關係重點是瞭解雲產品定位是否可以長期滿足業務需求,如:

  • 業務技術目前所處的階段是否與雲產品定位匹配
  • 業務快速迭代是否會受限於雲產品自身的發展
  • 雲產品的穩定如何
  • 雲產品是否可以持續為業務帶來技術紅利

    同時還需要了解雲產品是否可以伴隨業務發展,重點是業務對技術的需求中,哪些是雲產品層面由於定位帶來的限制,哪些是當前雲產品的技術實現帶來的限制。

若是雲產品定位帶來的限制,那麼就需要考慮使用和業務需求定位更匹配的雲產品。若是當前技術實現的限制,那麼有機會和雲產品共同成長,及時給雲產品反饋,使得雲產品可以更好滿足自身的業務需求。

除此之外,業務層面還需關注雲廠商自身服務型別的豐富性,雲廠商自身服務越豐富,規模越大,越會產生規模效應,進而給業務帶來更豐富的技術紅利和成本優勢。

幸運的是,雲產品通常都會有豐富的文件,也有相應的使用者群,可以直面產品經理和研發,及時反饋需求,以共建的理念協同發展。

小結

Serverless 本質上是一個問題域,將研發流程中非業務核心卻影響業務迭代的問題抽象化,並提出相應的解決方案。該概念不是突然產生的,大家或多或少已經將其理念應用到日常的工作中 ,只是伴隨著雲端計算浪潮,雲上的 Serverless 服務和產品更系統、更具有競爭力,可以基於規模優勢和豐富的產品線,面對問題域持續提供更滿足業務需求的服務。

Serverless 理念不僅在中心化的雲端蓬勃發展,目前也逐步在邊緣端發展,使得服務的執行更加廣泛化,更好滿足業務自身的客戶,提供更低延時、穩定的服務。

本篇文章嘗試從專案、開發的日常流程出發,協助讀者從日常實踐角度來理解 Serverless 概念,根據所處的階段選擇適合的 Serverless 服務和產品。同時作者本人在阿里雲 Serverless 應用引擎中負責底層研發工作,嘗試從雲產品內部的視角,傳遞雲產品和使用者共建的觀念,通過協同更好傳遞和創造價值。

References

課程推薦

為了更多開發者能夠享受到 Serverless 帶來的紅利,這一次,我們集結了 10+ 位阿里巴巴 Serverless 領域技術專家,打造出最適合開發者入門的 Serverless 公開課,讓你即學即用,輕鬆擁抱雲端計算的新正規化——Serverless。

點選即可免費觀看課程: https://developer.aliyun.com/learning/roadmap/serverless

阿里巴巴雲原生關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,做最懂雲原生開發者的公眾號。”

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69953029/viewspace-2692470/,如需轉載,請註明出處,否則將追究法律責任。

相關文章