前言
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中提 issue(readme中有項目社區羣聯絡方式) 。如果覺得好,請不吝star,我們需要你的支持與鼓勵!