歷川:華為云 Serverless 研發專家
丙真:華為云中間件 Serverless 產品經理分散治理、數據去中心化、基礎設施自動化等優秀設計原則,使得微服務架構在過去幾年中逐漸發展為企業應用架構的首選。然而,隨著應用規模的持續增長和微服務生態的成熟,新的挑戰也在不斷涌現出來。相比于傳統 SOA 等架構, 微服務架構給予開發者更多設計和開發 “自由度”,同一應用的各微服務模塊,可以采用不同的技術棧來實現獨立自治的業務邏輯。但自由也相應增加了開發運維的復雜度,提高了軟件開發者的認知成本;同時,微服務架構在業務資源開銷、交付速度、擴展性能和基礎設施彈性等方面,也面臨一系列新的挑戰。Serverless 編程范式的興起,允許開發者聚焦業務邏輯本身,無需再感知底層運行時細節和后端資源的維護伸縮等問題,給微服務應用開發提供了效率更高的選擇。本文結合華為云函數工作流 FunctionGraph、事件網格 EventGrid 以及云應用引擎 CAE 等在 Serverless Microservice 方面的實踐,總結提煉出包括基礎設施無感知、全生命周期可觀測、 狀態管理自動化等在內的七大 Serverless Microservice 開發 “實踐標準”,為加速全域 Serverless 產業升級、推動企業應用開發框架從微服務向 Serverless 演進提供一些思考。如圖 1 所示,在微服務架構中,應用程序由一組功能自治的小型化服務圍繞業務能力構建,服務之間采用輕量級通信,可以獨立開發、構建、測試、發布和監控。微服務的目的是有效拆分應用,實現敏捷開發和部署 [1]。Martin Fowler 和 James Lewis 在《Microservices: A Definition of This New Architectural Term》中,列舉了微服務架構的九大特征,如表 1 所示 (參見 [2]),這些特征使得微服務相比于傳統軟件開發架構,具有更加靈活的設計開發模式,服務之間支持獨立部署和擴展,有效提升了企業應用的開發、迭代和運維效率。盡管微服務架構秉承眾多優秀設計原則,隨著應用規模增長、技術生態的成熟和工具鏈的多元化發展,一系列新的挑戰逐漸呈現在企業應用開發者面前。相比于單體(Monolithic)或 SOA(Service-Oriented Architecture)等傳統架構下的 “規范標準”,微服務更提倡基于 “實踐標準” 解決分布式問題 [2];因此,對于服務注冊發現、負載均衡、配置和安全、事務處理等,在微服務場景中不再有統一的解決方案。例如,服務間通信方案就有數十種,包括 REST、gRPC、Thrift、Dubbo 等,服務發現也包含 CoreDNS、Eureka、ZooKeeper、ETCD 等多種技術選型 ; 應用開發人員從這些各有千秋的技術中,選擇最適合自己業務場景的系統性方案,無疑是一件門檻很高的任務 ; 盡管有 Spring Cloud 等一站式的全家桶工具集,對應用設計和運維人員來說,一攬子工具集所提供的技術組合復雜多樣,導致問題定位、定界效率低。除 Spring Cloud,Kubernetes 也逐漸成為一種主流的微服務解決方案。與 Spring Cloud 相比,Kubernetes 的配置管理和服務注冊功能更加友好,且“邊車代理模式”、服務網格 (e.g., Istio) 等技術的提出,顯著提高了服務治理的效率;但要實現這類解決方案的高效利用,開發者的認知成本和所面對的復雜性并不低;從 Spring Cloud 到 Kubernetes,復雜性沒有被減弱,更多地是被轉移。微服務架構也需要開發者掌握并發編程框架和分布式事務一致性等技術,這些技術本身具備不低的復雜性,以事務一致性為例,常見機制就包括 TCC (Try-Confirm-Cancel)、2/3PC (2/3 Phase Commit)、SAGA 等模式。盡管微服務提倡對應用進行拆分,但微服務的粒度仍然比較大。同一個微服務單元中,不同子功能之間的使用頻率(e.g., QPS、RPS et al.)、變更頻率等往往也不相同,因而對擴展性的訴求也不一樣。圖 2 展示了一個 Web 應用中“用戶管理”微服務的例子 [3],該微服務包含賬號注冊 API、登錄 API 和登出 API 三項子功能,在實際使用中,注冊 API 和登錄 API 的調用頻率通常遠高于登出 API,因此對擴展性的要求也高于后者;此時雖然可以對微服務進一步進行拆分,但整個應用的服務數量也可能會隨之翻倍,從而加重應用基礎設施的管理負擔。圖 2. 一個 Web 應用中“用戶管理”微服務的示例微服務粒度較大的問題也使得單個服務的擴容速度十分受限,在高并發場景下要實現微服務的快速彈性是一件十分困難的事;對于時延敏感型應用,并發請求的擴容訴求通常在秒級以內,甚至毫秒級,但在微服務架構下,服務彈性擴容則通常需要秒級以上甚至分鐘級的時延。與服務擴展效率和應用規模平衡相關的另一個難題是成本問題。受限于單個服務的彈性能力,微服務架構通常采用“多實例主備”或“多實例多活”的方案,來保障應用的高可用性,實現容錯、容災、負載均衡等目標。但與前文中討論的相似,同一個微服務應用的不同子服務之間,其承載的流量大小、調用頻率等的差距也可能很大,因此對資源的橫向、縱向擴縮容訴求也不一致,這種差距往往給企業帶來無畏的成本浪費。圖 3 展示了一個由 6 個功能不可或缺的子服務構建而成的微服務應用, 每個服務運行在虛機或容器中,圖中實線表示在給定的一段時間內企業為每個服務所占據的虛機或容器所支付的資源成本,虛線表示服務在業務運行中所實際消耗的資源成本。在圖 3 的示例中,微服務 F 由于被調用的頻率很高,其所占據的資源利用率也較高,而微服務 A 則相反,其所占據的資源成本和 F 相差不大(e.g., 2u2G 的容器),但 A 被調用的頻率則相對低很多,資源利用率也相應更低。在實際應用開發運維中,為保障高可用性和資源彈性,圖中實線與虛線之間通常存在較大的差距,這部分成本是企業為應用所占據但未使用的資源付出的成本,屬于一種成本浪費;同時,由于微服務架構通常不支持(一般也不建議)單個服務 “Scale-to-Zero”,且微服務應用逐漸變得越來越 “重”,上述 “資源占而不用” 導致的浪費現象也更加嚴重。云原生基礎設施的發展,有力促進了事件驅動的 Serverless 架構的廣泛應用。相比于微服務,Serverless 提供了一種更加細粒度的應用開發模型,以及更加便捷、輕量的應用運維框架。以 FaaS(Function-as-a-Service)為例,應用開發支持以單個函數作為最小部署單元,開發者只需提供函數代碼(包括源碼文件、鏡像等)和一些配置信息,即可實現應用的快速發布和上線;同時,后端資源的維護及其隨流量的自適應伸縮等復雜任務,則全部被下移到 Serverless 平臺側,顯著降低了開發者的認知成本和開發、運維門檻,如圖 4 所示;開發者只需為應用函數所實際使用的資源時長進行付費,付費粒度精確到毫秒級;同時,在應用流量負載為零的所有時間區間中,函數實例通過“Scale-to-zero”可以有效消除成本浪費,實現應用開發經濟化。圖 4. Serverless 應用開發架構的資源邊界示意與在微服務場景下相似,事件驅動式(Event-driven)也是 Serverless 函數架構的核心特征。Serverless 函數一般由函數代碼包和事件處理程序(event handler)構成,函數通過事件進行觸發,并對接收到的事件進行響應、處理。例如,FunctionGraph 支持多種類型的事件觸發器,滿足應用在不同業務場景下的訴求;同時,通過原生集成事件網格服務 EventGrid,FunctionGraph 為各類云服務、自定義應用、SaaS 應用提供了標準化、中心化的接入方式,事件可以在不同應用和服務之間靈活路由,幫助開發者快速構建松耦合、分布式的事件驅動式 Serverless 應用,如圖 5 所示。圖 5. EFG:基于 EventGrid 和 FunctionGraph 的事件驅動式 Serverless 應用模型基于函數快速實現 Serverless Microservice 應用
圖 6 給出了基于 FunctionGraph 和 APIG(API Gateway)的 Serverless Microservice 簡易應用模型,整個應用采用云上托管服務(managed services)構建,每個微服務由函數實現,并通過 APIG 對外暴露,函數之間采用 Workflow 進行功能編排。在該模型基礎上,我們用函數快速實現一個 Serverless Microservice 示例。圖 6. 基于 FunctionGraph 和 APIG 的 Serverless Microservice 模型以經典的電商應用為例,首先用 FunctionGraph 創建三個函數,分別實現 Product, Basket, Order 微服務,其中,Product 實現商品清單及詳情瀏覽,Basket 負責加購,Order 完成下單。交易相關的狀態采用分布式緩存服務 DCS(Distributed Cache Service)進行存儲,DCS 實例通過綁定獨立 VPC 來實現網絡私有和隔離,最后,我們為每個函數分別綁定一個 APIG 觸發器,對外暴露服務;如圖 7(1) - 7(5) 所示。圖 7-(1). 分別創建三個函數,實現微服務功能圖 7-(2). 授權 FunctionGraph 訪問 VPC 內服務 (i.e., DCS 實例)圖 7-(5). 最后為每個函數綁定 APIG 觸發器我們用 APIPost 進行簡單測試并返回函數界面查看監控信息,如圖 8(1) – (3) 所示:圖 8-(1). 用 APIPost 測試函數微服務最后,我們通過 EventGrid 進行異步事件解耦,并采用分布式消息服務 DMS(Distributed Message Service)實現基于 Fan Out/Fan In 的批處理,如圖 9 所示:圖 9. 一個基于事件驅動的 Serverless 函數架構的電商應用示例其中,EventGrid 創建事件訂閱時,事件源選擇 DCS 實例,事件目標選擇 FunctionGraph 函數,如圖 10 所示:云上 Serverless Microservice 實踐標準探索
在基于事件驅動式 Serverless 函數架構開發應用的過程中,遵循一定的設計 / 開發原則或“實踐標準”,有利于開發者構建更加高效、經濟和穩健的企業應用。本文結合華為云 FunctionGraph、EventGrid 以及 CAE 等云服務在 Serverless 領域的最佳實踐,總結并提煉出 Serverless microservice 應用開發的七類實踐標準,為開發者的架構決策提供參考;如表 2 所示。表 2. 云上 Serverless Microservice 應用開發的實踐標準探索基礎設施無感知(Infra-less):基礎設施無感知幫助開發者更快、更高效地構建應用程序,并顯著降低應用運維的成本和復雜性。除服務器無感知外,基礎設施無感知具有更廣泛的含義。包括開發者對平臺底層操作系統、分布式運行時以及硬件的有限制訪問,開發者無需感知 FunctionGraph 平臺是如何架構的,其它云服務與 FunctionGraph 的集成由華為云統一管理,只公開少量配置選項給開發者,開發者也無需感知函數在任何時間點被調用時實例資源位于哪個可用區(Available Zone, AZ),等等;這種抽象允許開發者專注于應用程序本身的功能開發、數據流設計和業務邏輯優化,從而更聚焦地為應用的終端用戶提供價值。全生命周期可觀測(Deep Observability):基礎設施無感知在提供便捷性的同時,也在開發者的“心智模型”方面降低了透明性,因此,全生命周期、深度、實例級的可觀測性,對于開發者實現對應用的自主掌控具有關鍵作用。Serverless 可觀測性包含鏈路追蹤,日志,和指標三類,主要服務于異常監控、性能調測、故障定位、問題定界等。例如,FunctionGraph 通過內置對接云日志服務 LTS,為應用函數提供日志監控能力,包括高級日志分析能力(e.g., loginsight)等;通過對接應用性能管理服務 APM,提供指標豐富的函數實例級監控;同時,支持全鏈路調用鏈管理等。開發者無需復雜的配置,即可享受應用函數全生命周期的深度可觀測性能力。流式編排(Flow Orchestration):編排是 Serverless 的核心概念之一,狹義的編排主要指工作流編排,如 FunctionGraph Workflow,在 Serverless microservice 應用開發中,開發者應盡量避免在單個函數中定制化地開發應用的各類分支邏輯及其異常處理程序,應盡可能采用函數工作流編排來實現,工作流編排提供了一種更加便捷的分支路由、錯誤捕獲以及異常處理方法,能夠增強應用邏輯的穩健性并提高全鏈路可觀測性 [4]。廣義的編排還包括服務流編排(Service Flow),應用架構所依賴的三方功能,如網關、消息、緩存等,也應盡可能采用云上托管服務,通過配置驅動、服務流編排的方式進行組裝式構建,從而盡可能減少定制化代碼的開發和維護,降低應用運維的負擔。FunctionGraph 原生支持開發者集成云上其它服務,表 3 列出了在 Serverless microservice 開發中最常用的幾類云服務。表 3:Serverless microservice 應用程序開發中常用的幾類云服務事件驅動(Event-driven):事件,表示狀態的變化。采用事件驅動的方式構建應用的優點在于松耦合、獨立擴縮容、良好的擴展性等。在狀態查詢、數據存取、函數調用等場景中,優先采用事件來代替傳統應用開發中常用的輪詢、Webhook 等機制,可以有效降低應用的復雜性、提高系統性能、或降低應用成本 [5]。以輪詢為例,由于系統狀態的更新在時間維度上不一定是規律且連續的,使得輪詢類策略往往是低效或非經濟的;Webhook 機制則在被集成的服務之間不一定能夠得到廣泛的支持。同時,輪詢和 webhook 機制在支持應用按需擴縮容方面也存在較大挑戰。采用事件驅動模式,開發者既可以很方便地構建實時系統,實現數據按需流動并避免過量的批處理任務;也可以通過將事件發布到 DMS 等消息服務,利用彈性緩沖區實現異步解耦,然后利用 EventGrid 對事件進行過濾和路由,從而增強應用在流量激變情形下的可伸縮性。交互式控制(Interactive Autopilot):交互式控制主要解決如何通過廣義的自動駕駛技術(autopilot)[7] 實現應用迭代和生產的高性能、低成本;對于 Serverless 函數而言,自動駕駛主要包括函數代碼包瘦身、源碼優化、資源規格選擇、并發度調優等問題。以函數資源規格選擇為例,過去主要依賴于開發者的工程經驗和其對自身業務場景的理解進行設定,但經驗性配置往往具有誤差大、靜態性、黑盒化等缺點;因此,FunctionGraph 提出在線式資源消耗感知與規格動態推薦等 autopilot 技術,配合離線式最佳規格調優(power tuning),最大限度幫助用戶實現應用函數 FinOps 效果,讓開發者能夠真正享受到 Economical Serverless 的福利 [8];開發者無需感知應用自動駕駛技術的實現細節,但整個過程 “處處可觀察、 實時可干預”。狀態管理自動化(Automatic State Management):盡管 Serverless 提倡無狀態優先,但在多數分布式應用中,狀態管理是無法回避且復雜度很高的任務。隨著數據密集型應用逐漸成為云上應用的主流,如大規模機器學習、大數據與流處理、實時交互型應用、多人協作類應用等,Serverless 編程框架對支持有狀態的訴求越來越強烈。FunctionGraph 作為業界首個支持有狀態的 Serverless 平臺,為開發者提供多種狀態一致性模型和自動化的并發處理機制,開發者通常只需要對函數中的簡單結構體進行操作,即可實現狀態數據的快速存取,整個狀態管理過程由平臺內置提供,無需與外部存儲服務之間進行頻繁交互,顯著減少了涉及大量狀態數據操作的網絡訪問次數,具有自動化、高性能、高可用等特點。伸縮原子輕量化(Lightweight Scaling Unit):伸縮原子,指最小可伸縮的運行單元,如單個函數。在 Serverless microservice 應用開發中,函數應盡可能小型化,功能上保持邏輯內聚,以響應外部事件為主,對應用全局邏輯弱感知;伸縮原子的輕量化,不僅能夠支持快速的獨立擴縮容以及高并發下的快速彈性能力,也能夠最大限度地保證應用的各個微服務函數能夠“按需擴縮容”,從而在保障應用負載 QoS 的前提下,實現極致成本。以事件驅動式函數架構為代表的 Serverless 編程模型,正在成為微服務應用開發的新一代標準框架。本文結合華為云 FunctionGraph 和 EventGrid 等在 Serverless 微服務方面的最佳實踐,總結并提煉出七大 Serverless Microservice 實踐標準, 為推動全域 Serverless 產業升級提供一些思考。更進一步地,華為云事件網格服務 EventGrid 將于近期正式轉商用,并聯合 FunctionGraph 推出事件驅動式函數應用開發模型 EFG(EventGrid-FunctionGraph); 同時,基于七大實踐標準并結合豐富的客戶實踐,EFG 將推出 Serverless Microservice 參考架構,為開發者構建事件驅動式 Serverless 解決方案提供可視化的架構抽象和優秀的業務建模支持。[1] Introduction to Microservices. https://www.nginx.com/blog/introduction-to-microservices/
[2] 周志明,《鳳凰架構:構筑可靠的大型分布式系統》
[3] 劉方明, 李林峰, 王磊, 《華為 Serverless 核心技術與實踐》.
[4] Understanding event-driven architecture – Part 1https://aws.amazon.com/blogs/compute/operating-lambda-design-principles-in-event-driven-architectures-part-2/
[5] Design principles in event-driven architectures – Part 2https://aws.amazon.com/cn/blogs/compute/operating-lambda-design-principles-in-event-driven-architectures-part-2/
[6] Anti-patterns in event-driven architectureshttps://aws.amazon.com/cn/blogs/compute/operating-lambda-anti-patterns-in-event-driven-architectures-part-3/
[7] Rzadca, K., Findeisen, P., Swiderski, J., Zych, P., Broniek, P., Kusmierek, J., ... & Wilkes, J. (2020, April). Autopilot: workload autoscaling at google. In Proceedings of the Fifteenth European Conference on Computer Systems (pp. 1-16).
[8] 歷川, 平山, 馮嘉, Serverless 遇到 FinOps: Economical Serverless,https://www.infoq.cn/article/ckibtiofxn4whycfjt8b
原文標題:Serverless時代的微服務開發指南:華為云提出七大實踐新標準
文章出處:【微信公眾號:華為DevCloud】歡迎添加關注!文章轉載請注明出處。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
原文標題:Serverless時代的微服務開發指南:華為云提出七大實踐新標準
文章出處:【微信號:華為DevCloud,微信公眾號:華為DevCloud】歡迎添加關注!文章轉載請注明出處。
相關推薦
電子發燒友網站提供《GD32F10x硬件開發指南.pdf》資料免費下載
發表于 02-07 17:30
?0次下載
電子發燒友網站提供《GD32E23x硬件開發指南.pdf》資料免費下載
發表于 02-07 16:20
?0次下載
架構師顧炯炯牽頭研發。它基于擎天 QingTian 架構、瑤光云腦、盤古大模型等根技術創新,是業界首款應用驅動的柔性算力云服務器,主要面向高科技、零售、金融、游戲等行業大多數通用工作負載場景,包括網絡應用、數據庫、虛擬桌面、分析
發表于 01-23 17:58
?106次閱讀
讀者介紹 Flexus 云服務器 X 實例的快速入門和配置指南,幫助他們更好地利用華為云的強大功能。 一、
發表于 01-13 11:11
?352次閱讀
電子發燒友網站提供《VCA5807開發指南.pdf》資料免費下載
發表于 01-03 16:56
?0次下載
電子發燒友網站提供《超值音棒參考設計套件開發指南.pdf》資料免費下載
發表于 12-21 09:16
?0次下載
電子發燒友網站提供《MSP430? MCU開發指南.pdf》資料免費下載
發表于 11-06 09:57
?0次下載
微服務架構與容器云密切相關又有所區別。微服務將大型應用拆分為小型、獨立的服務,而容器云基于容器技術,為微
發表于 10-21 17:28
?285次閱讀
電子發燒友網站提供《MSP430 MCU開發指南.pdf》資料免費下載
發表于 10-10 17:19
?1次下載
【摘要】 近年來,華為云持續構筑全域 Serverless 云服務,推出了一系列競爭力領先的 Serve
發表于 09-27 00:06
?912次閱讀
電子發燒友網站提供《LVGL開發指南介紹.pdf》資料免費下載
發表于 09-09 10:24
?17次下載
電子發燒友網站提供《RA/RX電機應用開發指南.pdf》資料免費下載
發表于 08-15 09:44
?0次下載
隨著數字化時代的快速發展,AI 技術已成為推動行業創新的關鍵動力。華為云緊跟時代步伐,全新上線 Serverless 應用中心,為用戶提供海
發表于 03-19 22:57
?507次閱讀
一、ArkTS\\\\API9,服務器端基于serverless開發的應用與元服務華為賬號注冊登錄功能暫時是不支持的
二、3月1日后的審核
發表于 02-20 10:14
新賬戶,Serverless云存儲沒法創建 ,沒法進行下一步。
解決方式
請按照這個方式修改一下就能正常創建了,瀏覽器中打開控制臺輸入
window.top.cfpConfig.cloudStorageSwitch=‘off’ 后再創建桶
發表于 02-19 11:21
評論