EventMesh:微眾銀行開源的新型雲原生事件驅動架構實踐

語言: CN / TW / HK

前言

2020 年微眾銀行在 GitHub 上正式開源了 EventMesh。 EventMesh 和 DeFiBus一起作為微眾銀行已經開源的專案,目前支撐了微眾銀行每天億級的金融交易。

作為一個動態外掛式雲原生基礎服務,EventMesh 提供了靈活,可靠和快速的事件分發與處理,並且可進行管理。本篇文章將圍繞 EventMesh 起源及原理等方面進行介紹,並結合微眾銀行的實踐經驗帶領大家一起探索事件驅動架構。

01 什麼是事件驅動架構

近年來,隨著微服務、雲原生和 Serverless 概念的普及以及容器化技術的發展,事件驅動也再次成為熱點,引起IT界廣泛的關注。事件驅動架構是一種用於設計應用的軟體架構和模型。對於事件驅動系統而言,事件的捕獲、通訊、處理和持久保留是解決方案的核心結構。事件驅動架構可以最大程度減少耦合度,很好地擴充套件與適配不同型別的服務元件,因此是現代化分散式應用架構的理想之選。

  • 解耦

基於這種松耦合,微服務可以用不同的語言實現。解耦後的微服務能夠輕鬆地在網路上相互獨立地擴充套件,通過動態新增或刪除事件生產者和消費者來修改他們的系統,而不需要更改任何微服務中的任何邏輯。

  • 基於推送通知的訊息傳輸機制

事件驅動的體系結構中,客戶端無需輪詢就可以接收更新,事件在到達事件儲存後就會通知給客戶端,客戶端可以隨時接收更新,這對於動態資料轉換、分析和資料科學處理非常有用。

  • 可追溯與審計

事件流是事實的不變流,其中每個事實由流中的事件表示。每當實體狀態發生變化時,都會發出一個新事件。事件驅動的體系結構可以通過實現事件追溯(Event Sourcing) 等模式來提供不可變事件的日誌,這是審計的關鍵。

  • 加速機器學習與資料科學的模型選擇

事件驅動架構為加速機器學習模型從開發到生產提供了一種有效的方法,可允許使用機器學習技術的系統同時針對資料測試多個模型,並在正確的時間提供最合適的模型。模型可以使用業務事件,實時地將結果廣播給另一個服務,該服務可以根據一些關於速度、預測精度等的業務標準選擇服務哪個模型。因為模型可以不斷地測試和改進,所以該體系結構允許更快的、迭代的開發,可以快速地部署到生產環境中。

 

02 EventMesh 是什麼

EventMesh 是以事件驅動為核心的基礎服務,EventMesh 之於微服務與Service Mesh 具有同等的定位。EventMesh 作為動態的外掛式雲原生基礎服務層,將應用程式和中介軟體層分離,並提供了靈活,可靠和快速的事件分發能力,同時可以對事件進行管理,可以作為應用程序的連線層,提供企業實現其數字化轉型目標所需的全套應用程序間通訊模式。

03 為什麼需要 EventMesh 

EventMesh 可以作為 Service Mesh 的補充,在應用程式之間實現更好的通訊,並允許應用程式通過將某些功能放在網路層和應用程式層之間使我們可以更多地關注業務邏輯。但是,相比之下,兩者有一些重要的區別:

這些區別體現了 EventMesh 的非同步通訊的特點和優勢,以及相比 Service Mesh 具有覆蓋更廣泛應用場景的能力。

04 微眾銀行 EventMesh 整體架構

EventMesh 目前整體的架構如圖所示,通過以事件驅動為核心的體系結構,實現了應用程式與中介軟體層的解耦分離。

同時目前 EventMesh 分別提供了 HTTP API 與 TCP API 更加方便多語言客戶端的接入代理。

EventMesh-Runtime 元件以外掛化的形式運行了不同的 Connector, 進而支援對接多種 Event Store,客戶端通過向 Runtime 發出釋出\訂閱指令,完成事件的釋出與訂閱。Runtime 基於 Open MessagingConnector Interface 介面,實現對Connector 的排程,客戶端所發出的事件交予 Runtime 排程的 Connector,將事件儲存到對應的 Event Store 中進而再由訂閱對應事件的 EventMesh 將事件接收並轉發給所代理的下游客戶端。

EventMeshRuntime 大大簡化了客戶端的邏輯,自身提供了事件的釋出\訂閱、治理、傳輸加密、事件路由、Session 管理、負載均衡、指標監控等能力。

同時,EventMesh 作為以事件驅動架構為核心的中介軟體基礎服務,積極擁抱雲原生,支援動態擴縮容,具備容器化安裝部署的能力。

關鍵部件:

  • eventmesh-runtime

    一種中介軟體,用於在事件產生者和消費者之間傳輸事件,支援雲原生應用程式和微服務

  • eventmesh-sdk-java

    當前支援 HTTP 和 TCP 協議,未來會支援 gRPC 等

  • eventmesh-registry

    自動在連線到 EventMesh 的應用程式和服務之間路由事件, 管理 runtime

  • eventmesh-connector-defibus

    一種基於 OpenMessagingConnector 介面的實現,支援將 DeFiBus 作為事件儲存,運行於 eventmesh-runtime 之上,實現事件的釋出與訂閱

  • eventmesh-connector-rocketmq

    一種基於 OpenMessagingConnector 介面的實現,支援將 RocketMQ 作為事件儲存,運行於 eventmesh-runtime 之上,實現事件的釋出與訂閱。

通過上圖可以將 EventMesh 橫向分為 Control Panel、Data Panel、Store Panel三層。

  • Data Panel

App 與 EventMesh 的事件資訊互動處於 Data Panel 中,從該模型可以看出EventMesh 充分地將事件生產者與消費者進行了解耦,任何事件生產者都不需要知道它們的事件消費者。類似地,當任何事件消費者使用訊息時,它們只需要訂閱事件流。事件的生產者與消費者均可以彈性地擴縮容而互無影響。

  • Control Panel

Control Panel 中分為治理模組、註冊模組、安全模組、指標模組、追蹤定位模組,這些模組都將採用業界通用、優秀的解決方案與 EventMesh 進行對接,進而豐富 EventMesh 的生態環境。例如:註冊模組可對接 Nacos、指標模組可對接Prometheus、追蹤定位模組可對接 SkyWalking 等。

  • Store Panel

Store Panel 為事件儲存面板,藉助 connector 外掛,客戶端通過 EventMesh 可以將事件釋出到對應的事件儲存中,目前已支援 DeFiBus、RocketMQ 作為事件儲存,使用者可根據業務的使用場景來選擇對應事件儲存,進而體驗不同事件儲存的相關特性。
 

05 EventMesh 核心特性與能力

  • 可插拔式事件儲存

EventMesh 不僅將事件生產者與消費者進行解耦,還降低了執行時與事件儲存程式碼之間的耦合度。事件儲存(DeFiBus/RocketMQ/Kafka/Redis 等)以外掛化的形式接入 EventMesh,因此 EventMesh 可以更為靈活地擴充套件事件儲存,通過對接不同的事件儲存,使用者可以享受到不同事件儲存所具有的特性。

  • 雲原生

EventMesh 遵循面向雲原生的 OpenMessaging 介面定義,通過不同事件儲存外掛對介面的實現,完成事件的釋出\訂閱,同時 EventMesh 對事件的定義遵循 Cloud Event 標準協議,統一了不同語言事件接入的協議入口。同時 EventMesh 支援 sideCar 形式的部署模式,可通過K8S進行管理。

  • 多語言代理接入,協議簡化

EventMesh 可為多種語言 (java/go/python/c/...)進行代理,目前提供http/tcp 兩種接入方式, 客戶端不需關注事件儲存元件的相關協議,僅需遵循 EventMesh 協議,與 EventMesh 對接,減少了直接對接事件儲存的複雜度,降低不同語言客戶端的接入成本。

  • 叢集高可用

EventMesh 具有叢集化能力,客戶端通過負載均衡策略與 EventMesh 叢集建連,支援 gateWay 形式的部署模式,EventMesh 對客戶端支援組級別代理。
 

06 EventMesh 特性規劃

  • 支援 Cloud Event 事件標準協議

  • 支援事件溯源與事務

基於 saga 的分散式事務的思想設計實現,需要考慮事務補償、重試,同時下游系統要保證冪等,以及事務補償的成功性,不需人工介入。

事件的溯源與重現,配合 CQRS,需通過領域模型設計聚合物件、EventStore 與聚合資源庫、物化檢視與查詢。可以使用 Event Sourcing 的事件資料來分析資料產生的過程,解決 bug,也可以用來分析使用者的行為。

  • 支援事件過濾

  • 支援對接 Promethus 指標採集

  • 支援多語言 SDK(c\go\python\wsam)

  • 支援事件編排,工作流處理

  • 支援事件治理

  • 支援對接 Skywalking、zipkin 等進行事件跟蹤

  • 支援對接 Spiffe 等進行事件安全管控

  • 支援 openmessaging-storage-dledger 為預設事件儲存實現dledger 是一款 OpenMessaging 中基於 raft 打造的 commitLog 儲存庫實現,可以作為分散式儲存系統的持久層,具有高可用、高持久、強一致的特性。

  • 支援事件管理臺

  • 支援事件 schema 登錄檔

    通過對事件 schema 的註冊管理,來確保事件報文的準確性,提升事件觸達的成功率。

  • 支援 grpc 協議

  • 支援 MQTT 協議

  • 支援函式式觸發器與繫結,對接 Serverless

  • 支援通過配置方法名與引數,動態路由函式式介面。

 

07 寫在最後

EventMesh 和 DeFiBus 目前支撐了微眾銀行每天億級的金融交易,且已經開源。DeFiBus 是一款由微眾銀行打造的安全可控的分散式金融級訊息匯流排,提供了 RPC 同步呼叫,還提供了 MQ 的非同步事件通知、事件組播和廣播等常用服務呼叫和訊息模式,同時增加了應用多中心多活、服務就近、灰度釋出等分散式場景下的高可用能力。在對於機器故障的容錯能力方面的增強,也讓訊息匯流排的服務更加穩定可靠,為業務提供 7x24 的服務。
專案地址:

https://github.com/WeBankFinTech/EventMesh

https://gitee.com/webank/EventMesh

https://github.com/WeBankFinTech/DeFiBus

https://gitee.com/webank/DeFiBus
誠邀關注雲端計算的你一同參與到Event Mesh 中,我們歡迎任何形式的貢獻,有各種建議或意見可在 GitHub/ gitee中提 issuereadme中有專案社群群聯絡方式) 。如果覺得好,請不吝star,我們需要你的支援與鼓勵!

分享到: