来源 | 微众开源
责编 | 寇雪芹
头图 | 微众开源
2020 年微众银行在 GitHub 上正式开源了 EventMesh。作为一个动态插件式云原生基础服务,EventMesh 可进行事件分发、处理与管理。本文将对 EventMesh 的起源及原理等方面进行介绍,并结合微众银行的实践经验探索事件驱动架构。
什么是事件驱动架构
近年来,随着微服务、云原生和 Serverless 概念的普及以及容器化技术的发展,事件驱动也再次成为热点,引起IT界广泛的关注。事件驱动架构是一种用于设计应用的软件架构和模型。对于事件驱动系统而言,事件的捕获、通信、处理和持久保留是解决方案的核心结构。事件驱动架构可以最大程度减少耦合度,很好地扩展与适配不同类型的服务组件,因此是现代化分布式应用架构的理想之选。
基于这种松耦合,微服务可以用不同的语言实现。解耦后的微服务能够轻松地在网络上相互独立地扩展,通过动态添加或删除事件生产者和消费者来修改他们的系统,而不需要更改任何微服务中的任何逻辑。
基于推送通知的消息传输机制
事件驱动的体系结构中,客户端无需轮询就可以接收更新,事件在到达事件存储后就会通知给客户端,客户端可以随时接收更新,这对于动态数据转换、分析和数据科学处理非常有用。
可追溯与审计
事件流是事实的不变流,其中每个事实由流中的事件表示。每当实体状态发生变化时,都会发出一个新事件。事件驱动的体系结构可以通过实现事件追溯(Event Sourcing) 等模式来提供不可变事件的日志,这是审计的关键。
加速机器学习与数据科学的模型选择
事件驱动架构为加速机器学习模型从开发到生产提供了一种有效的方法,可允许使用机器学习技术的系统同时针对数据测试多个模型,并在正确的时间提供最合适的模型。模型可以使用业务事件,实时地将结果广播给另一个服务,该服务可以根据一些关于速度、预测精度等的业务标准选择服务哪个模型。因为模型可以不断地测试和改进,所以该体系结构允许更快的、迭代的开发,可以快速地部署到生产环境中。
EventMesh 是什么
EventMesh 是以事件驱动为核心的基础服务,EventMesh 之于微服务与Service Mesh 具有同等的定位。EventMesh 作为动态的插件式云原生基础服务层,将应用程序和中间件层分离,并提供了灵活,可靠和快速的事件分发能力,同时可以对事件进行管理,可以作为应用进程的连接层,提供企业实现其数字化转型目标所需的全套应用进程间通信模式。
为什么需要 EventMesh
EventMesh 可以作为 Service Mesh 的补充,在应用程序之间实现更好的通信,并允许应用程序通过将某些功能放在网络层和应用程序层之间使我们可以更多地关注业务逻辑。但是,相比之下,两者有一些重要的区别:
这些区别体现了 EventMesh 的异步通信的特点和优势,以及相比 Service Mesh 具有覆盖更广泛应用场景的能力。
微众银行 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 作为事件存储,用户可根据业务的使用场景来选择对应事件存储,进而体验不同事件存储的相关特性。
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 对客户端支持组级别代理。
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
支持通过配置方法名与参数,动态路由函数式接口。
写在最后
EventMesh 和 DeFiBus 已经开源,支撑了微众银行每天亿级的金融交易。DeFiBus 是一款由微众银行打造的分布式金融级消息总线,提供 RPC 同步调用、 MQ 的异步事件通知、事件组播和广播等常用服务调用和消息模式,同时增加了应用多中心多活、服务就近、灰度发布等分布式场景下的高可用能力。
项目地址:
https://github.com/WeBankFinTech/EventMesh
https://gitee.com/webank/EventMesh
https://github.com/WeBankFinTech/DeFiBus
https://gitee.com/webank/DeFiBus
更多阅读推荐