如何設計一個事件驅動系統?
什麼是事件驅動架構?
事件驅動架構(Event-Driven Architecture,簡稱 EDA),它是一種架構風格,其特徵是存在許多相對獨立的參與者,他們通過事件相互通信以實現協調的目標。
事件驅動型架構遵循 “發佈 / 訂閱” 模式,允許近乎實時地分發有關業務事件的信息,在這種架構中,微服務在實體或域模型發生變化時異步發佈事件,而不是同步調用 API。事件驅動架構通常包含以下組件:
-
事件:事件是系統中發生的某種特定情況或變化的表示。事件可以是用戶操作(如點擊按鈕)、系統狀態的變化(如數據庫記錄的更新)、外部系統的通知等。
-
事件生產者:事件生產者是生成事件的組件或服務。當某個特定情況發生時,事件生產者會創建一個事件並將其發送出去。生產者可以是用戶界面、傳感器、服務等。
-
事件消費者:事件消費者是接收和處理事件的組件或服務。消費者訂閱特定類型的事件,並在接收到事件後執行相應的業務邏輯。消費者可以是微服務、函數、作業處理器等。
-
事件通道:事件通道是事件在生產者和消費者之間傳遞的媒介。常見的事件通道有消息隊列(如 RabbitMQ、Kafka)、事件總線(如 AWS EventBridge)、發佈 / 訂閱系統等。
-
事件處理:事件處理是消費者接收到事件後的操作。處理可以是簡單的業務邏輯執行,也可以是複雜的工作流,包括調用其他服務、更新數據庫、觸發進一步的事件等。
到目前爲止,全球超過 72% 的組織使用 EDA 來驅動他們的應用程序、系統和流程,比如多人遊戲、在線銀行、流媒體服務以及生成式人工智能。
EDA 的工作原理
事件驅動架構中的事件代表系統中的發生或變化,驅動流動。它們由各種來源生成,發佈到事件總線或消息代理,並由感興趣的組件異步消費,以下是事件驅動架構的基本原理:
-
事件生成:當某個特定情況發生時,事件生產者創建一個事件,並將其發送到事件通道。
-
事件傳遞:事件通過事件通道傳遞到一個或多個事件消費者。事件通道負責可靠地傳遞事件,確保事件不會丟失。
-
事件處理:事件消費者接收到事件後,執行相應的業務邏輯。處理可以是同步的,也可以是異步的,取決於具體的實現需求。
-
後續操作:事件處理完成後,可能會觸發新的事件,繼續驅動系統的操作。這個過程可以形成一個複雜的事件鏈,協同完成複雜的業務流程。
整個工作流程可以抽象成下圖:
事件驅動系統利用最終一致性,採用事件溯源和 CQRS(命令和查詢職責分離:一種將數據存儲的讀取和更新操作分離的模式,以提高性能、可擴展性和安全性)等技術。事件溯源將系統狀態的所有變化捕獲爲一系列事件,便於系統在任何時候進行重建。CQRS 分離讀取和寫入操作,實現高效查詢,同時保持一致性。
通過採用事件驅動架構,系統能夠異步和獨立地對事件做出反應,使其具有可擴展性。
如何使用 EDA?
一個常見的例子是基於 GUI 的應用程序,例如視頻遊戲:應用程序根據用戶的鼠標點擊或菜單選擇進行工作。這個類比可以擴展到系統層次的功能,用於實現業務邏輯和工作流,遠遠超出了最終用戶可能看到的範圍。事件驅動編程通常是給定組件在基於微服務的架構中支持其角色的方式。
Apache Kafka,一種分佈式事件流平臺,通常用於事件驅動架構中,以實現高效的事件驅動通信。EDA 模式支持實時事件處理、事件溯源、命令查詢職責分離(CQRS)和發佈 / 訂閱消息傳遞。
當這些模式和技術結合使用時,可以實現處理大量事件的可擴展和彈性架構。各個組件發送事件,表示系統級或業務級活動或請求;這些事件由事件處理平臺收集,用於過濾、增強和分發給其他相關或感興趣的組件。組件之間的通信通過每個組件發佈的微服務來處理。在組件內部,微服務是使用事件驅動編程模型實現的。
EDA 具有改進響應能力、靈活性和可擴展性等優勢,但它也引入了複雜性,如運營開銷、事件排序挑戰,以及有效的事件建模和管理的需求。
總之,事件驅動架構利用事件驅動編程、事件驅動微服務和事件處理技術等架構模式,構建可擴展、靈活、松耦合的系統,以處理和處理實時事件和工作流。
通過應用 EDA 模式並考慮相關的優點和權衡,組織可以設計和部署能夠擴展和適應不斷變化的業務需求的健壯系統。
使用案例
在實際工作中 EDA 有着廣泛的使用,這裏列舉了一些常見的 EDA 使用領域:
-
電子商務訂單處理:當客戶下訂單時,會觸發一個事件以啓動庫存管理、支付處理和運輸協調。
-
物聯網(IoT)數據收集:當傳感器數據超過某個閾值時,IoT 設備會生成事件,使得實時監控和分析各種應用成爲可能。
-
用戶註冊和認證:當用戶註冊或登錄時,會觸發事件以驗證憑據、更新用戶資料並授予對不同系統資源的訪問權限。
-
通知系統:當滿足特定條件時,例如收到新消息或分配任務,會觸發事件通知相關用戶通過電子郵件、短信或推送通知。
-
股票市場交易:當市場條件變化時,會生成事件以觸發自動交易策略,實現買賣訂單的實時執行。
-
實時分析:當數據流接收時,會觸發事件,允許持續分析和洞察生成,例如監控網站流量或檢測欺詐活動。
-
工作流管理:當任務完成或達到里程碑時,會觸發事件以推進工作流,確保無縫協作和流程自動化。
-
智能家居中的傳感器集成:當傳感器檢測到運動、溫度變化或門的開啓時,會生成事件,觸發動作如開燈或調整恆溫器設置。
-
事件驅動微服務:事件用於不同微服務之間的通信,實現松耦合和可擴展的系統。
-
在線遊戲:當玩家執行動作時,會觸發事件,例如移動角色或完成任務,允許參與者之間的實時交互和遊戲同步。
下面以 Kafka、Flink 和 Confluent 用於大規模完全託管的事件驅動架構爲例進行說明:
EDA 模式基於松耦合系統通過事件異步通信的原則,事件代表系統或工作流中的重要發生或變化,實現這一模式的理想框架是 Apache Kafka。
Kafka 是一種開源的流數據管道框架,用於實時收集、存儲和處理事件及其數據。Kafka 充當高度可擴展和容錯的事件代理,提供可靠的事件存儲和傳遞。它通過提供事件流的強大基礎來幫助管理事件驅動系統的複雜性。Kafka 擁有豐富的工具、連接器和管理功能生態系統,使組織能夠高效地構建、管理和擴展事件驅動系統。
Confluent 提供 Apache Kafka 作爲本地軟件,也作爲完全託管的雲服務。作爲託管服務,Confluent 擴展了 Kafka 的強大功能,如用於管理和監控 Kafka 集羣的集中控制平面,以及用於將 Kafka 與其他應用程序連接的連接器和集成。這些功能使企業能夠更輕鬆地訪問、存儲和管理數據,作爲連續的實時流。
Confluent 被認爲是事件驅動架構的最佳解決方案,因爲其圍繞 Apache Kafka 構建的全面和可擴展平臺,提供高性能、容錯的事件流能力,以及豐富的工具、連接器和管理功能生態系統,使組織能夠高效地構建、管理和擴展事件驅動系統。
Confluent 的託管服務還將提供 Apache Flink 的 SQL 功能。Flink 是一個開源的流處理框架,通過高級事件時間處理、有狀態計算、容錯和批處理功能,爲 EDA 模式帶來了更多的能力和功能。
Kafka 和 Flink 共同實現了從多個來源捕獲事件和數據的廣泛功能,這些數據可以通過強大且可擴展的數據管道和流處理進行處理、過濾和進一步增強,以供其他下游消費者和微服務使用。
除了 Kafka 和 Flink,Confluent 作爲事件流平臺的領導者,還提供額外的功能以應對實施 EDA 模式的複雜性和挑戰:
-
Kafka Streams:一個輕量級的 Java 庫,與 Apache Kafka 緊密集成。開發人員可以使用它通過直接處理 Kafka 主題中的數據並將結果生成回 Kafka,構建實時應用程序和微服務。由於它是 Kafka 的一部分,Kafka Streams 本身就利用了 Kafka 的優勢。
-
Schema Registry:Confluent Schema Registry 允許在事件驅動系統中進行集中式模式管理。它使模式在時間上演變,同時確保向後兼容。這通過提供管理事件格式演變的機制,幫助解決事件一致性挑戰。
-
監控和可觀察性:Confluent 提供監控和可觀察性工具和功能,使開發人員和操作人員能夠深入瞭解其事件驅動系統的健康狀況和性能。這些工具通過提供事件流動可見性、性能指標和錯誤跟蹤,幫助調試和故障排除。
-
安全性和加密:Confluent 提供一系列功能來保護和審計敏感數據,並防止未經授權的訪問,這有助於在實施事件驅動架構時解決重要的安全考慮,尤其是在數據隱私和安全至關重要的企業環境中。
-
數據連接性:Confluent 提供廣泛的數據連接器,可在 Kafka 與其他數據源或接收器之間無縫地攝取或導出數據。這些包括 Kafka Connect(一個用於構建和運行 Kafka 連接器的開源框架)、Confluent 連接器(Confluent 支持的 JDBC、Elasticsearch、Amazon S3 連接器、HDFS、Salesforce、MQTT 和其他流行數據源的連接器)、社區連接器(由社區成員貢獻和維護)和自定義連接器(由組織自己的開發人員構建)。
-
生態系統集成:Confluent 提供與事件驅動架構中常用的各種工具和框架的集成,如 Apache Flink、Apache Spark 和 Kubernetes。這些集成簡化了在現有基礎設施和工具中採用和管理事件驅動系統。
EDA 的優點
事件驅動架構包含很多優點,以下列舉了事件驅動架構的最顯著的幾個優點:
松耦合和可擴展性
EDA 通過使用事件解耦組件,促進了組件之間的松耦合。在 EDA 中,組件通過異步事件消息進行交互,使它們能夠獨立開發、部署和擴展。這種松耦合使系統具有更好的模塊化、靈活性和敏捷性。可以添加或修改新組件而不影響現有組件,便於擴展和適應不斷變化的業務需求。
實時處理和響應能力
EDA 通過響應事件的發生實現實時處理和響應能力。事件,如用戶交互、系統通知或外部觸發,被捕獲並近實時處理。這確保了系統能夠快速響應變化,實現更快的決策、實時分析和即時行動。EDA 特別適用於實時數據處理和響應能力至關重要的用例,如金融系統、IoT 應用或實時監控。
可靠性和容錯性
EDA 通過利用事件驅動通信增強系統的可靠性和容錯性。事件可以記錄並存儲在持久事件存儲中,提供過去事件的審計跟蹤。這允許錯誤處理、恢復和事件重放,確保容錯和系統彈性。在發生故障時,可以通過重放事件將組件恢復到一致狀態,提供可靠和一致的系統。
與不同系統的無縫集成
EDA 促進了與不同系統和技術的無縫集成。由於組件通過事件進行通信,它們可以在不同系統之間交換數據和觸發操作。這使得數據交換和互操作性更加高效,因爲事件可以由各種系統消費和生成,而不論其底層技術或編程語言。EDA 支持創建集成微服務、遺留系統、雲服務和第三方應用程序的事件驅動架構。
總體而言,事件驅動架構提供了技術優勢,使組織能夠構建靈活、可擴展、響應迅速和可靠的系統。通過採用松耦合、實時處理、容錯和無縫集成,EDA 使得開發能夠滿足現代應用程序需求的健壯和敏捷系統成爲可能。
EDA 的缺點
雖然 EDA 提供了衆多好處,但它也存在一些挑戰:
複雜性
與傳統的單體架構相比,EDA 引入了額外的複雜性。它需要事件生產者、事件消費者、事件代理和其他組件,這會增加整體系統的複雜性。
事件排序
在事件驅動系統中確保事件的正確順序可能具有挑戰性。某些用例,如金融交易或數據一致性,可能需要嚴格的事件排序,這需要仔細的設計和實現。
最終一致性
在分佈式系統中,實現跨多個服務或組件的事件一致性可能很困難。維護數據完整性並確保所有相關係統正確響應事件可能是一項複雜的任務。基於 EDA 的架構面臨相同的挑戰。
調試和故障排除
在事件驅動系統中識別和診斷問題可能比傳統的請求 - 響應系統更復雜。事件可以觸發跨各種組件的一系列反應,使得跟蹤流動和識別問題的根本原因變得具有挑戰性。
總結
本文我們詳細的分析了事件驅動架構,EDA 是一種很常見的軟件設計模式,通過鬆耦合組件和異步通信,促進靈活性、可擴展性和容錯性等特性,使系統能夠實時檢測、處理和響應事件。
儘管 EDA 有很多優點,但它同時給系統帶來複雜性和調試挑戰,因此,在 EDA 選擇時,需要根據真實的業務權衡。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/CwwLAm9kTCDVmfLzihxT2g