天天看點

事件驅動型架構

作者:程式員47
事件驅動型架構

事件驅動型架構是一種軟體設計模式,其中微服務會對狀态變化(稱為“事件”)作出反應。事件可以攜帶狀态(例如商品價格或收貨位址),或者事件也可以是辨別符(例如,訂單送達或發貨通知)。事件會觸發協同工作以實作共同目标的微服務,但除了事件格式之外,無需互相了解任何資訊。雖然微服務協同工作,但每個微服務都可以應用不同的業務邏輯,并發出自己的輸出事件。

事件具有以下特征:

  • 事件記錄已經發生的事情。
  • 事件捕獲無法更改或删除的不可變事實。
  • 無論服務在使用事件時是否應用任何邏輯,事件都會發生。
  • 事件可以大規模無限期地持久保留,并且可以根據需要多次使用。

在事件驅動型系統中,事件由事件生成方生成,然後由事件路由器(或代理)提取并過濾,然後被扇出至适當的事件使用方(或接收器)。事件會被轉發到由一個或多個比對觸發器定義的訂閱者。這三個元件(事件生成方、事件路由器、事件使用方)是脫耦的,可以獨立部署、更新和擴縮:

事件驅動型架構

事件路由器連接配接不同的服務,充當發送和接收消息的媒介。它對事件生成方生成的原始事件進行響應,并将此響應發送給适當的下遊使用者。事件是異步處理的,其結果會在服務對事件作出反應或受事件影響時決定,下圖展示了一個簡化的事件流:

事件驅動型架構

何時使用事件驅動型架構

設計系統時,請考慮以下用法。

  • 監控并接收提醒,了解存儲分區、資料庫表、虛拟機或其他資源的異常情況或更改。
  • 将一個活動扇出到多個使用方。事件路由器會将事件推送到所有适當的使用者,您無需編寫自定義代碼。然後,每個服務可以并行但以不同方式處理事件。
  • 在不同的技術棧之間提供互操作性,同時保持每個堆棧的獨立性。
  • 協調跨不同區域和帳号營運和部署的系統和團隊。您可以輕松重新組織微服務的所有權。由于跨團隊依賴項減少,您可以更快地對更改作出反應,而在非事件驅動型架構中,響應速度通常會受到資料通路權限壁壘的限制。

事件驅動型架構的優勢

以下是建構事件驅動型架構的一些優勢。

松散耦合和更好的開發者靈活性

事件生成方與事件使用方在邏輯上是分開的。事件的生成與使用的分離意味着服務具有互操作性,但可以獨立擴縮、更新和部署。

松散耦合可以減少依賴項,并允許您以不同的語言和架構實作服務。您無需更改任何一個服務的邏輯,即可添加或移除事件生成方和接收方。您無需編寫自定義代碼來輪詢、過濾和路由事件。

異步事件和彈性

在事件驅動型系統中,事件是異步生成的,并且可以在事件發生時發出,而無需等待響應。松散耦合的元件意味着,如果一個服務失敗,其他服務不受影響。如有必要,您可以記錄事件,使接收服務可以從故障點恢複,或重放過去的事件。

基于推送的消息傳遞、實時事件流和更低的費用

事件驅動型系統允許輕松的基于推送的消息傳遞,用戶端無需持續輪詢遠端服務,而是可以接收關于狀态更改的更新。這些推送的消息可用于即時資料處理和轉換,以及實時分析。此外,由于輪詢變少,網絡 I/O 随之降低,費用也會減少。

簡化稽核和事件溯源

事件路由器的集中化位置可簡化稽核,允許您控制誰可以與路由器進行互動,以及哪些使用者和資源可以通路您的資料。您還可以加密傳輸中的資料和靜态資料。

此外,您還可以利用事件溯源這一架構模式,它可記錄對應用狀态所做的所有更改,并按照更改最初應用的順序進行記錄。事件溯源提供不可變事件的日志,這些儲存的日志可以用于稽核,用于重建曆史狀态,或者作為規範叙事來說明業務驅動的決策。

架構注意事項

事件驅動型架構可能要求您以新的方式設計應用。雖然事件驅動型架構非常适合使用微服務或解耦元件的應用,但您還應考慮以下事項:

  • 如果您需要處理每個事件,您的事件來源是否可以保證傳送?
  • 事件來源應該持久且可靠。
  • 您的應用是否可以處理多個異步請求?
  • 您的系統性能不應依賴于全局範圍或非彈性資料庫。
  • 您希望如何跟蹤事件流?
  • 事件驅動型架構支援使用監控服務進行動态跟蹤,但不支援使用代碼分析進行靜态跟蹤。
  • 您是否要使用事件來源中的資料重建狀态?
  • 您應考慮如何確定資料去重和有序。

繼續閱讀