事件驅動的基於微服務的系統的架構注意事項

今天的 IT 系統正在生成、收集和處理比以往更多的數據。而且,他們正在處理高度複雜的流程(正在自動化)以及跨越典型組織邊界的系統和設備之間的集成。同時,預計 IT 系統的開發速度更快、成本更低,同時還具有高可用性、可擴展性和彈性。

爲了實現這些目標,開發人員正在採用架構風格和編程範式,例如微服務、事件驅動架構、DevOps 等。正在構建新的工具和框架來幫助開發人員實現這些期望。

開發人員正在結合事件驅動架構 (EDA) 和微服務架構風格來構建具有極強可擴展性、可用、容錯、併發且易於開發和維護的系統。

在本文中,我將討論使用這兩種架構風格構建這些系統時的架構特徵、複雜性、關注點、關鍵架構注意事項和最佳實踐。儘管 API、API 網關和 UI 等組件在架構上很重要,但在本文中我將主要關注事件驅動的微服務。

事件驅動架構和微服務架構概述

事件驅動架構(EDA)已經存在了很長時間。雲、微服務和無服務器編程範式以及複雜的開發框架正在提高 EDA 在實時解決關鍵任務業務問題中的適用性。Kafka、IBM Cloud Pak for Integration 和 Lightbend 等技術和平臺以及 Spring Cloud Stream、Quarkus 和 Camel 等開發框架都爲 EDA 開發提供一流的支持。EDA 還擴展到流數據處理,這是開發實時人工智能或機器學習解決方案的要求。文章 “事件驅動架構的優勢” 定義了 EDA 並解釋了爲什麼開發人員應該使用它。

微服務架構正在被廣泛採用並用於轉型項目,這些項目涉及將單體應用程序分解爲使用域驅動設計識別的自包含、獨立部署的服務。Martin Fowler 和 James Lewis 的文章很好地介紹了微服務架構及其特性。微服務可以公開 API,並具有用於生成和使用事件的接口,以與 EDA 無縫集成。它的許多特性使其成爲將其與 EDA 相結合的理想選擇。文章 “微服務架構風格的挑戰和好處” 討論了開發人員在實現微服務時面臨的挑戰。

下表顯示了這兩種架構風格如何相互補充:

jmV8b2

通過結合這兩種架構風格,開發人員可以構建分佈式、高度可擴展、可用、容錯和可擴展的系統。這些系統可以實時消費、處理、聚合或關聯極其大量的事件或信息。開發人員可以使用行業標準的開源框架和雲平臺輕鬆擴展和增強這些系統。

架構問題和複雜性

通過結合 EDA 和微服務架構風格,開發人員可以輕鬆實現非功能性品質,例如性能、可擴展性、可用性、彈性和易於開發。然而,這兩種架構風格也引入了一些主要問題。

其中一些擔憂包括:

EDA - 微服務系統的架構藍圖

下圖是一個基於 EDA - 微服務的企業系統的架構圖。一些微服務組件和類型單獨顯示,以使架構更清晰。

此藍圖中的 EDA 和特定於微服務的組件是:

主要架構考慮因素

架構方面的考慮會影響系統的架構。它們充當制定架構決策的指南。它們對系統的非功能特性有重大影響。以下架構注意事項對於事件驅動、基於微服務的系統極爲重要:

架構模式

選擇架構和集成模式是事件驅動、基於微服務的系統的關鍵架構考慮因素。它們爲許多所需的架構質量提供經過驗證和測試的解決方案。以下架構模式在開發事件驅動、基於微服務的系統中非常有用:

此外,許多企業集成模式和微服務模式爲基於事件驅動的微服務系統提供了構建塊。

需要根據系統所需的需求和架構質量來選擇模式。

技術棧

事件代理、數據緩存或網格、微服務框架、安全機制、分佈式數據庫、監控系統和警報系統等組件構成了事件驅動、基於微服務的系統的技術骨幹。該主幹爲關鍵架構質量(性能、可用性、可靠性、運營成本、容錯性等)提供支持並簡化了開發。它還影響一些設計和開發決策。

在選擇您的技術堆棧時,請考慮以下特徵:

下表列出了不同組件的流行選擇:

sAaBlo

事件建模

事件建模包括定義事件類型、事件層次結構、事件元數據和有效負載模式。仔細考慮這些事件建模特徵:

事件處理拓撲

在 EDA 中,處理拓撲是指對生產者、消費者、企業集成模式以及主題和隊列的組織,以提供事件處理能力。它們基本上是事件處理管道,其中部分功能邏輯(處理器)使用企業集成模式、隊列和主題連接在一起。處理拓撲是 SEDA、EIP 和 Pipes & Filter 模式的組合。對於複雜的事件處理,多個處理拓撲可以相互連接。

處理拓撲中的另一個關鍵概念是編排與編排。編排是指擁有一箇中央編排器,通過調用不同的組件來編排處理工作流。每當需要對處理進行嚴格控制時,都會選擇編排,例如用於支付處理。編排通常用於採用 SAGA 模式的地方。編排需要在性能和可用性之間進行權衡(因爲編排器可能會成爲單點故障)。編舞指完全去中心化的處理方式。也就是說,事件被髮布並且感興趣的組件訂閱主題。沒有中央組件來控制處理流程。編排的實現和維護很複雜。

請考慮以下有關創建處理拓撲的指南:

可以使用流程事件流和事件管理狀態等架構實踐來設計處理拓撲。在定義處理拓撲時詳細瞭解事件代理功能也很好。例如,Kafka 流爲定義事件流處理拓撲提供了一流的支持。當對事件流執行聚合和連接操作時,Kakfa 還提供對狀態存儲的自動支持。

下圖描繪了處理拓撲的藍圖。

下圖描述了在線購物的簡化訂單處理拓撲。路由器能夠動態地將事件路由到多個主題。另請注意,事件處理器還將具有 “事件過濾器”,以根據上下文控制事件的消費和生產。

部署拓撲

在 EDA 微服務架構中,需要部署許多組件。應該選擇一個部署拓撲,以便滿足與可伸縮性、可用性、彈性、安全性和成本相關的架構要求。但是,需要在冗餘、性能和成本之間進行權衡。部署到雲使架構更具性能、彈性和成本效益。應利用雲部署(例如 high availabilityKubernetes 中的設置)提供的功能。

考慮爲您的部署拓撲考慮以下關鍵原則:

此外,支持自動部署、自動故障轉移、滾動升級或藍綠部署以及配置的外部化以使部署工件的環境獨立,這一點很重要。

異常處理策略

在 EDA 中,擁有全面且一致的異常處理策略對於提高彈性非常重要。異常處理策略由以下全部或部分組成:

異常可以有兩種類型:業務異常和系統異常。當驗證或業務條件失敗時會引發業務異常。系統異常是由於組件(數據庫、事件代理或其他微服務)不可用或由於資源問題(例如 OutOfMemory 錯誤)、網絡或傳輸相關問題(例如有效負載序列化或反序列化錯誤)而導致的廣泛故障類別,或意外的代碼故障(例如 NullPointerException 或 ClassCastException)。

處理不同類型異常的方式存在顯着差異。下面列出了一些異常處理機制:

您的開發框架應該支持在所有微服務中使用一致的異常處理策略。它應該爲業務異常提供一組預定義的異常類,並提供一個通用的異常處理程序,該處理程序可以使用配置進行定製,但強制執行與異常處理相關的架構決策。大多數開發框架確實提供了這種支持。但是,它們需要正確配置或擴展以提供所需的功能。

事件主幹能力和約束

不同的事件骨幹產品或平臺爲架構質量提供不同的支持。同時,它們對設計和架構施加了限制。在定義架構時,應考慮其能力和約束以有效解決非功能性需求。例如,以下是 Kafka 的一些重要功能和約束。

安全

開發人員必須考慮 EDA 微服務架構中的這些安全方面:

可觀察性

可觀察性包括監控、記錄、跟蹤和警報。系統的每個組件都應該是可觀察的,以避免故障並從故障中快速恢復。

大多數 EDA 產品和開發框架通過發佈可導出到 Prometheus 和 Grafana、ELK、StatsD 和 Graphite、Splunk 或 AppDynamics 等行業標準可觀察性工具的指標來提供對可觀察性的支持。例如,Apache Kafka 提供了可以導出並與大多數這些工具集成的詳細指標。此外,爲事件主幹 (IBM Event Streams) 提供託管服務的雲平臺爲可觀察性提供一流的支持。Spring 或 Camel 等微服務開發框架爲代碼檢測提供了良好的支持以進行監控。

從 EDA 的角度來看,檢測生產者和消費者的代碼以發佈指標、發佈事件代理指標並通過指標儀表板關聯這些是必不可少的,因爲 EDA 中分佈式組件的數量很多。從 EDA 的角度來看,一些關鍵指標是傳入和傳出消息的速率、消費滯後、網絡延遲、隊列和主題大小等。

有關監控微服務,請參閱我的監控 Spring Boot 微服務教程,瞭解有關檢測和監控微服務的詳細信息。

容錯和響應

爲了提供足夠的容錯能力,架構需要提供冗餘、異常處理和彈性伸縮(當超出閾值時放大,當負載恢復正常時縮小)。藉助 EDA 和雲,其中大部分都可以輕鬆實現。事件主幹通過支持隊列和主題的集羣和複製來滿足容錯。生產者和消費者可以部署多個實例。當在 Kubernetes 平臺上部署爲容器時,可以通過自動縮放(使用水平 pod 自動縮放器)輕鬆實現彈性縮放,但必須爲生產者和消費者設計異常處理。

儘管基於 EDA 的系統通過分級架構提供彈性,但快速故障響應和恢復對於避免延遲和一致性問題至關重要。要實現這種快速恢復,您需要:

結論

開發者可以結合事件驅動架構和微服務架構風格來開發分佈式、高可用、容錯和高吞吐量的系統。這些系統可以處理非常大量的信息,並且可以具有極高的可擴展性。然而,在構建此類系統時,開發人員必須考慮許多架構問題和複雜性,並做出許多關鍵的架構決策。在本文中,討論了關鍵的架構決策以及做出這些決策需要考慮的因素。通過遵循本文中的指導,可以定義一個健壯的 EDA 微服務架構來實現預期的目標。

來源:

https://www.toutiao.com/a7058632639380472357/?log_from=eae0ef2ae2b7e_1644802188555

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/8kKTtdbNXabKA8h7sehVJA