如何設計一個事件驅動系統?

什麼是事件驅動架構?

事件驅動架構(Event-Driven Architecture,簡稱 EDA),它是一種架構風格,其特徵是存在許多相對獨立的參與者,他們通過事件相互通信以實現協調的目標。

事件驅動型架構遵循 “發佈 / 訂閱” 模式,允許近乎實時地分發有關業務事件的信息,在這種架構中,微服務在實體或域模型發生變化時異步發佈事件,而不是同步調用 API。事件驅動架構通常包含以下組件:

到目前爲止,全球超過 72% 的組織使用 EDA 來驅動他們的應用程序、系統和流程,比如多人遊戲、在線銀行、流媒體服務以及生成式人工智能。

EDA 的工作原理

事件驅動架構中的事件代表系統中的發生或變化,驅動流動。它們由各種來源生成,發佈到事件總線或消息代理,並由感興趣的組件異步消費,以下是事件驅動架構的基本原理:

整個工作流程可以抽象成下圖:

事件驅動系統利用最終一致性,採用事件溯源和 CQRS(命令和查詢職責分離:一種將數據存儲的讀取和更新操作分離的模式,以提高性能、可擴展性和安全性)等技術。事件溯源將系統狀態的所有變化捕獲爲一系列事件,便於系統在任何時候進行重建。CQRS 分離讀取和寫入操作,實現高效查詢,同時保持一致性。

通過採用事件驅動架構,系統能夠異步和獨立地對事件做出反應,使其具有可擴展性。

如何使用 EDA?

一個常見的例子是基於 GUI 的應用程序,例如視頻遊戲:應用程序根據用戶的鼠標點擊或菜單選擇進行工作。這個類比可以擴展到系統層次的功能,用於實現業務邏輯和工作流,遠遠超出了最終用戶可能看到的範圍。事件驅動編程通常是給定組件在基於微服務的架構中支持其角色的方式。

Apache Kafka,一種分佈式事件流平臺,通常用於事件驅動架構中,以實現高效的事件驅動通信。EDA 模式支持實時事件處理、事件溯源、命令查詢職責分離(CQRS)和發佈 / 訂閱消息傳遞。

當這些模式和技術結合使用時,可以實現處理大量事件的可擴展和彈性架構。各個組件發送事件,表示系統級或業務級活動或請求;這些事件由事件處理平臺收集,用於過濾、增強和分發給其他相關或感興趣的組件。組件之間的通信通過每個組件發佈的微服務來處理。在組件內部,微服務是使用事件驅動編程模型實現的。

EDA 具有改進響應能力、靈活性和可擴展性等優勢,但它也引入了複雜性,如運營開銷、事件排序挑戰,以及有效的事件建模和管理的需求。

總之,事件驅動架構利用事件驅動編程、事件驅動微服務和事件處理技術等架構模式,構建可擴展、靈活、松耦合的系統,以處理和處理實時事件和工作流。

通過應用 EDA 模式並考慮相關的優點和權衡,組織可以設計和部署能夠擴展和適應不斷變化的業務需求的健壯系統。

使用案例

在實際工作中 EDA 有着廣泛的使用,這裏列舉了一些常見的 EDA 使用領域:

  1. 電子商務訂單處理:當客戶下訂單時,會觸發一個事件以啓動庫存管理、支付處理和運輸協調。

  2. 物聯網(IoT)數據收集:當傳感器數據超過某個閾值時,IoT 設備會生成事件,使得實時監控和分析各種應用成爲可能。

  3. 用戶註冊和認證:當用戶註冊或登錄時,會觸發事件以驗證憑據、更新用戶資料並授予對不同系統資源的訪問權限。

  4. 通知系統:當滿足特定條件時,例如收到新消息或分配任務,會觸發事件通知相關用戶通過電子郵件、短信或推送通知。

  5. 股票市場交易:當市場條件變化時,會生成事件以觸發自動交易策略,實現買賣訂單的實時執行。

  6. 實時分析:當數據流接收時,會觸發事件,允許持續分析和洞察生成,例如監控網站流量或檢測欺詐活動。

  7. 工作流管理:當任務完成或達到里程碑時,會觸發事件以推進工作流,確保無縫協作和流程自動化。

  8. 智能家居中的傳感器集成:當傳感器檢測到運動、溫度變化或門的開啓時,會生成事件,觸發動作如開燈或調整恆溫器設置。

  9. 事件驅動微服務:事件用於不同微服務之間的通信,實現松耦合和可擴展的系統。

  10. 在線遊戲:當玩家執行動作時,會觸發事件,例如移動角色或完成任務,允許參與者之間的實時交互和遊戲同步。

下面以 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 模式的複雜性和挑戰:

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