Serverless 服務選型

綜述


近兩年來,Serverless 概念在開發者中交流的越來越多,實踐、服務、產品層出不窮。

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

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

新概念、新產品的產生不是憑空出現,它們誕生之初要解決的是當前問題。隨着實踐者對問題域的理解越來越清晰和深刻,會逐步迭代問題的處理方法,提供更接近問題本質的解決方案。

若不從問題域出發來理解解決方案,容易陷入兩個極端,即「它能解決一切問題」「它太超前了,理解不了」。

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

迭代模型


從項目整體視角來看:

這個模型的目標是滿足客戶需求。通過 被動迭代 滿足客戶提出的需求,同時逐步深刻理解客戶需求的本質,通過 主動迭代 和客戶一起採用更好的方案或從根源解決面對的問題。

每次的需求反饋會加深對客戶需求的理解,提供更滿足需求的服務。每次的 bug 反饋會加深對處理方案的理解,提供更穩定的服務。

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

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

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

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

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

  • 部署&運維 佔用的時間和精力,會遠大於 開發&測試

  • 通用邏輯 佔用的時間和精力,會接近甚至超過 業務邏輯

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

從左至右,通過下放不同層次的運維工作,降低「部署&運維」成本。在降低了運維工作成本後,在「通用邏輯」層面降低成本。二者結合起來,在迭代過程中更深入聚焦業務。

該過程也是從 Cloud Hosting 到 Cloud Native 的過程,充分享受雲原生帶來的技術紅利。

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

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

Serverless 簡介


維基百科對於 Serverless 有較爲完備的定義 [1]:

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. It can be a form of utility computing.

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

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 的這篇文章 [2] 站在架構的角度,對 Serverless 開發模型做了充分的闡述,這裏做個簡單的總結,核心圍繞三點:

  • Event-driven 開發模型

  • 自動彈性伸縮

  • OpenAPI

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

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

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

圖 2

圖 3

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

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

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

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

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

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

Serverless 服務模型


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

  • 免運維 (服務器運維、容量管理、彈性伸縮等)

  • 按資源的使用量付費

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

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

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

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

  • 資源實例平臺

  • 調度平臺

  • 應用管理平臺

  • 業務邏輯管理平臺

綜合起來,即:

阿里雲 Serverless 產品


國內的雲服務廠商,阿里雲提供的 Serverless 服務和產品形態相對完備。這裏以阿里云爲例進行探討,探討的經驗可以平滑遷移到其他雲服務廠商。

從阿里雲公開的資料 [5] 可以瞭解到幾類常見的 Serverless 產品形態:

上述雲產品分類可以清晰和圖 1 的模型對應起來,用戶在進行選擇時,先整理當前業務技術所處的階段和痛點,確定對雲上方案的需求,然後再根據雲廠商的產品形態做對應,選擇適合當前階段的服務和雲產品。

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

  • 業務技術目前所處的階段是否有對應的 Serverless 產品形態

  • 業務快速迭代是否會受限於雲產品自身的發展

  • 雲產品的穩定如何

  • 雲產品是否可以持續爲業務帶來技術紅利

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

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

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

幸運的是,雲產品通常都會有豐富的文檔,也有相應的用戶羣,可以直面產品 PD 和研發。雲產品的 PD 和研發也很期望直面用戶,聆聽用戶的反饋和需求,和用戶一起共建。

下面簡單介紹下阿里雲 Serverless 產品和用戶釘釘羣。

阿里雲 ECI 產品 [6] 是 Serverless 和容器化的彈性計算服務,用戶無需管理底層服務器,只需要提供打包好的鏡像,即可運行容器,並僅爲容器實際運行消耗的資源付費。

阿里雲 Serverless Kubernetes (簡稱 ASK) 是阿里雲容器服務產品 [7] 家族中的一種形態,託管 Kubernetes Master 組件,依託阿里雲 ECI 產品提供 Pod 實例,用戶無需運維 Kubernetes Master 和 Agent 節點即可使用 Kubernetes 調度能力,詳情可參見產品文檔 [8]。

阿里雲 Serverless 應用引擎 (簡稱 SAE) [9] 是面向應用的 Serverless PaaS 平臺,幫助 PaaS 層用戶免運維 IaaS,按需使用,按量計費,實現低門檻微服務應用上雲,有效解決成本及效率問題。支持 Spring Cloud、Dubbo 和 HSF 等流行的開發框架,真正實現了 Serverless 架構和微服務架構的完美融合。除了微服務應用外,用戶還能通過 Docker 鏡像部署任何語言的應用。

阿里雲函數計算有兩款產品,函數計算 [10] 是一個事件驅動的全託管 Serverless 計算服務,用戶無需管理服務器等基礎設施,只需編寫代碼並上傳,函數計算會爲用戶準備好計算資源,並以彈性、可靠的方式運行用戶代碼。Serverless 工作流 [11] 是一個用來協調多個分佈式任務執行的全託管 Serverless 雲服務,致力於簡化開發和運行業務流程所需要的任務協調、狀態管理以及錯誤處理等繁瑣工作,讓用戶聚焦業務邏輯開發。用戶可以用順序、分支、並行等方式來編排分佈式任務,服務會按照設定好的順序可靠地協調任務執行,跟蹤每個任務的狀態轉換,並在必要時執行用戶定義的重試邏輯,以確保工作流順利完成。

用戶釘釘羣:



小結


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

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

本篇文章嘗試從項目、開發的日常流程出發,協助讀者從日常實踐角度來理解 Serverless 概念,根據所處的階段選擇適合的 Serverless 服務和產品。並嘗試從雲產品內部的視角,傳遞雲產品和用戶共建的觀念,通過不同的分工更好傳遞和創造價值。

作者信息:

張翼飛(悟鵬),阿里雲技術專家,目前負責 SAE 產品的 Infra 研發工作,對 Serverless、安全容器、Kubernetes 等有深入的理解和實踐,專注於 Serverless 底層技術實現。

References

[1] wikipedia: Serverless computing

https://en.wikipedia.org/wiki/Serverless_computing

[2] Martin Fowler: Serverless Architectures

https://martinfowler.com/articles/serverless.html

[3] wikipedia: Event-driven architecture

https://en.wikipedia.org/wiki/Event-driven_architecture

[4] wikipedia: Mobile backend as a service

https://en.wikipedia.org/wiki/Mobile_backend_as_a_service

[5] 從 DevOps 到 NoOps,Serverless 技術的落地方式探討

https://yq.aliyun.com/articles/754236

[6] 阿里雲 ECI 產品主頁

https://www.aliyun.com/product/eci

[7] 阿里雲容器服務

https://www.aliyun.com/product/kubernetes

[8] 阿里雲 Serverless Kubernetes 產品文檔

https://help.aliyun.com/document_detail/86366.html

[9] 阿里雲 Serverless 應用引擎

https://www.aliyun.com/product/sae

[10] 阿里雲函數計算

https://www.aliyun.com/product/fc

[11] 阿里雲 Serverless 工作流

https://www.aliyun.com/product/fnf

Cloud Programming Simplified: A Berkeley View on Serverless Computing

https://www2.eecs.berkeley.edu/Pubs/TechRpts/2019/EECS-2019-3.pdf?spm=ata.13261165.0.0.24c275f8HV8b9B&file=EECS-2019-3.pdf

本文縮略圖:icon by 雪兒082590

Tips:

# 點下“看”❤️

# 然後,公衆號對話框內發送“檯曆”,試試手氣?????

# 本期獎品是阿里雲定製版檯曆

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章