深度解读分布式应用提效框架 Apache EventMesh

简介: 在 2021 年 11 月 12 日落地的 ArchSummit 全球架构师峰会(深圳站)上,我们邀请了微众银行的资深技术专家陈广胜为大家带来了《分布式应用提效框架 Apache EventMesh》的分享,他从 EventMesh 的特征入手,为大家深入介绍了 EventMesh 在微众银行的探索与实践。本文为演讲整理文章~

今天分享 Apache EventMesh 事件驱动的分布式应用运行时,这是一个比较新的概念,希望可以通过本次的分享,给大家带来一些启发。

我们都了解两个概念——消息和事件,消息指的是具体事件的更新,这种更新是从一个点发送到另外一个点之后,消息就会被删除,消息是临时存在的状态;而事件是指在特定时间发生的,它并没有绑定到具体的接收者或客户端,它往往是可以被回放、回溯和再加工。

根据 Gartner 的一份报告显示,随着时间的推移,数据的价值将逐渐减少。在很多实时场景下,如果能够对事件进行实时的分析和数据挖掘,那将会带来很大的价值,像现在非常火的流式计算 Flink、Spark 以及 ClickHouse 等,他们都非常关注数据的实时性,EventMesh 可以及时地传递数据。

EventMesh

image.png

我们先来了解 EventMesh 架构图,EventMesh 的定位是事件驱动分布式应用运行时。EventMesh 可以提供非常轻量级、多语言的客户端以及各种各样的协议,例如 MQTT、Cloudevents、Web Socket 和 MQP,与此同时,它可以提供 gRPC、TCP 和 HTTP 等传输的协议。

EventMesh Runtime 是一个插件化的架构,可以对接到后端的中间件或者服务,比如事件的存储 RocketMQ、Kafaka 以 及 Apache Pulsar 等;如果需要有一些状态更新维护的时候,可以对接到后端的 Redis、MySQL 以及 Mongo DB 等;如果需要有一些冷数据更新的时候,也是可以通过插件化的形式连接到 S3,ES 等存储。

在控制层面,如果需要对事件的调用链进行跟踪、元数据进行管理以及分布式协调性的时候,EventMesh Runtime 也可以对接到 ETCD、NACOS、 Prometheus、Zipkin、Skywalking

、OpenTelemetry 等。我们内部最常用的是 RocketMQ 以及 Redis 两个插件,不过 EventMesh 也可以很方便地与 Kubernetes 进行集成,这是因为 EventMesh Runtime 可以作为 Sidecar 部署,也可以作为 Gateway 部署。

我们再看一下当前在微服务领域的 REST Drive 和 Event Drive,他们各自的优缺点非常明显。就 Spring Cloud、HTTP2、gRPC 通信而言,当 REST 调用服务的时候,由于工业界非常完善的工具文档以及开发工具客户端,开发起来非常方便,但是 REST Drive 的所有调用都是同步的,同步则意味着阻塞。如果在一个链中,任何节点的服务出现缓慢调用或故障,那么便会影响到最前端的服务调用,那么当 Spring Cloud 与 Dubbo 服务建立通信的时候,需要付出更多的成本。

然而在事件驱动领域,当接入网关或进行业务层面的框架层适配的时候,它的调用是异步的,所有的状态是最终一致的,并且可以与很多的服务以及中间层解耦。另外像 Queue 订阅发布方式,扩容非常方便。但是它需要依赖一层中间件,中间件的复杂度需要人工处理,不过这层复杂度可以使用 EventMesh 屏蔽掉,所以对应用的开发本身而言,轻量又便捷。

SeviceMesh vs EventMesh

image.png

接下来分享一下 SeviceMesh vs EventMesh 的区别。

SeviceMesh 需要 Sidecar,所有数据层面的通信是在 Sidecar 之间的转发,不过在 EventMesh 中,我们看到单个或多个服务可以挂在 EventMesh 的单个节点,EventMesh 具备较强的微服务编排能力,但是 EventMesh 并不能解决所有的问题,它的优势在于事件驱动,它也可以做到 Request、Reply。

服务有同步和异步之分,同步调用可以采用 SeviceMesh,异步调用可以采用 EventMesh 。当然 EventMesh 也可以做同步调用,SeviceMes 也可以做异步调用,但是两者本身的定位以及处理的场景不一样,所以 SeviceMesh 与 EventMesh 可以结合使用。

image.png

例如,前端 Web App 通过 API 网关进来的调用,转发到前置或某个业务领域的服务,它会进行内部服务之间的调用,这个过程便会产生数据,数据会进入到关系型数据库或者 NoSQL 数据库。但是入数据库的这一动作,可能需要让其他的服务订阅或关注到,这个时候,我们可以将事件或者服务转发给 EventMesh,让 EventMesh 驱动关心这些事件的服务进行后续工作。

image.png

接着,我们一起看看 EventMesh 的作用。

在 DMZ 区或 ECN 区域,部署网关或者前置服务的作用是为了进行协议的转换——从外部的 HTTP 或 HTTPS 接口协议的服务,转换到内部不同的服务框架(例如 Dubbo、Spring Cloud)的协议。当外部、公网或者合作方流量进入此区域的时候,内部区域将会形成非常复杂网状的结构,边界区流量治理非常不方便。

现在的通用做法是在边界布置网关,但是当有了 EventMesh 之后,我们只需要在外联区和内部区域布置两个 EventMesh(可以是集群,也可以是节点),这样边界区的服务只需要在 EventMesh 之间进行通讯,而且当请求到了内部服务的时候,通过内部区域的 EventMesh 可以形成很多网格,每一个 EventMesh 网格代理了向其注册的服务。不同的 EventMesh 以及其代理的服务连接起来,形成较大的事件网格,很多复杂调用场景的治理将会变得极其简单。

EventMesh Feature

image.png

这一部分我将会介绍几个重要的 EventMesh Feature。

Pub/Sub+
现在有非常多各种云以及私有部署环境下的服务,服务与服务之间的连接可以通过 EventMesh 来完成。不同的区域的服务,使用的协议和语言不一样,但是通过 Pub/Sub+的形式增加的任何协议、节点、服务,都可以统一汇聚到 EventMesh 形成的网格中。

举个例子,当大家在亚马逊云上发布事件之后,私有化部署 Kubernetes 的某服务节点订阅了这个消息,消息可以跨越很多节点路由到 Kubernetes 服务。同时,当多个区域的服务订阅了相同的主题,只要将消息发送到对应的主题,对应的服务会自动将消息接收下来。EventMesh 可以解决连接协议的多样性、语言的多样性,并且可以解决边界区的连接问题。

事件总线

image.png

事件驱动架构(EDA)是一种以事件为纽带,将不同系统进行解耦的异步架构设计模型。在 EDA 中,事件驱动的运行流程天然地划分了各个系统的业务语义,用户可以根据需求对事件与针对此事件做出的响应灵活定制,这使得基于 EDA 架构可以方便地构建出高伸缩性的应用。

HTTP Source 事件源是 EventMesh 支持的事件源的一种,它以 Webhook 形式暴露了发布事件的 HTTP 请求地址,用户可以在有 URL 回调的场景配置 HTTP Source 事件源,或者直接使用最简单的 HTTP 客户端来完成事件的发布。HTTP Source 事件源提供了支持 HTTP 与 HTTPS,公有云 VPC 等不同请求方式、不同网络环境的 Webhook URL,便于用户将其集成到各类应用中。接入时无需使用客户端,仅需保证应用可以访问到对应 Webhook URL 即可,这使得接入过程变得简单而高效。

在将 HTTP 请求转换为 CloudEvent 的时候,EventMesh 会将请求的头部和消息体部分置于 CloudEvents 字段中,其余字段会依据用户 EventMesh 资源属性以及系统默认规则进行填充。用户可以在事件规则中,对所需的内容进行过滤、提取,最终按照模板拼装成所需的消息内容投递给事件目标。

Streaming

image.png

在当前的微服务下,当我们进行流量调度的时候,肯定需要解码消息头,根据消息头的特定字段,路由到对应的服务上以便增加策略。

实际上在事件驱动中,首先我们不需要解码报文,我们在它的消息主题设计上,可以解决类似的问题。比如可以设计非常多 Topic 层级,层级与层级之间有递进关系,以此来实现动态的过滤。其次,当消息到达之后,可以很方便地针对消息进行报文解析,在产生的事件上面,我们可以增加非常多的 Match 处理函数,产生的消息可以实时地经过 filter chain 的处理。事件的处理都可以由 EventMesh 来完成。

编排与协调

image.png

在上图的左边区域,当写入复杂的 Case、If else 条件或引入工作流之后,它的编排有很多串行的分支,但是如果采用 EventMesh 编排,看起来将会非常简洁。

我们只需要订阅感兴趣的事件,发送对应的事件到对方主题上就可以,我们并不需要关注对方 IP 的所在地,也不需要关注服务部署在虚拟机还是在容器上,以及对方服务实例数量,当然更不需要关注对方实例挂了之后,我们是否需要进行熔断等等。下游的 EventMesh 可以完成所有的事情,例如,当它下游的服务发生故障,消息将会自动分发到当前在线的服务实例。从上面这张图,大家可以看出,采用 EventMesh 可以使得编排与协调过程更加清晰。

动态扩缩容
接下来是扩缩容场景,当现有的 Kubernetes 在进行扩缩容的时候,有两个常见的场景。

image.png

首先是扩容场景,例如,在当前的 CPU 占用很高的时候,正常情况会触发扩容事件,但我们在消息队列中,并没有看到特别多的消息堆积,也就是说,这个时候并不需要扩容,实际上这个扩容是浪费的;其次是缩容场景,例如在消息队列里,当前没有消息堆积,理论上实例是可以缩容,甚至可以缩容到零,但是因为 CPU 的使用导致无法顺利缩容。

image.png

但是这两种场景,如果在事件驱动的服务下,我们采用 Queue 队列堆积的监控方式可以实现以下效果。首先是在资源占用很高,但队列的任务没有堆积的情况下,可以不进行扩容;其次,在占用当前的 CPU 的资源,但没有任务处理的情况下,可以进行缩容。在我看来,伸缩监控的指标应该根据当前处理的任务堆积情况来判断。

Bridge(Federated Governance)
没有治理前,就如下图一样,各个不同区域之间形成了数据的孤岛。

image.png

但当治理之后,就变成了下图一样的这样网格状态,清晰且简洁。

image.png

在过去十年的大部分时间里,企业都在与数据孤岛作斗争,数据孤岛是孤立的持久性存储,拥有无数但无法访问的知识,他们的主要武器是数据湖:一个巨大的集中式数据存储,将 TB 级的特定于域的数据保存在一个逻辑位置。没有领域知识的数据专​​家试图从不同的数据集中挖掘数据价值是很困难的,而且几乎没有动力向数据湖贡献高质量数据的数据生产者。

EventMesh 具备实时分析、大规模数据收集、平台无关的连接以及对开放标准的支持等能力,理想情况下,对客户数据的任何更改都应通过事件网格之类的东西实时推送给依赖的消费者,但如果数据不太重要或不及时,数据消费者可以在需要时提取(或查询)数据。

我们正在从数据无政府状态过渡到联合治理和成熟的企业数据策略——理想情况下,可以将策略有效地表示为代码的最终状态。联合治理需要特定于任务的工具、事件目录和 AsyncAPI 等标准。企业级数据策略还包括访问控制、法规(即 GDPR)、机密性(如 PII 和 PHI)、编辑和加密等特性/功能。功能的示例可能包括强制性标头元数据(将数据上下文化)、可观察性要求、主题结构(用于路由)以及通过模式验证和其他工具实现的数据质量。

EventMesh in WeBank Message Bus(DeFiBus)

image.png

在微众银行,已经开源的消息总线 DeFiBus 如上图所示,这里以三个 EventMesh 的节点为例,每一个 EventMesh 节点,可以在其上面订阅服务。当发送方发布一个事件之后,其他的 EventMesh 上的任何服务,只要订阅了 Topic,这个事件便可以发送到对应的服务上,它能够自动地学习和更新路由表。

EventMesh 在微众银行内部解决了以下问题,首先是多语言治理问题,例如 AI 计算使用 Python、很多银行的系统使用 C 语言,EventMesh 能够简化接入消息总线的复杂度,同时我们知道,推动业务的 SDK 的升级非常麻烦,当 SDK 轻量简化之后,我们只需要负责中间件层的发布,就可以节省掉应用推动升级的成本。除了应用在业务系统外,EventMesh 还应用在流量复制回放平台,消息旁路过滤,消息多活路由,AI 联邦学习,区块链等场景,更多的场景在持续探索实践过程中,未来有机会再分享给大家。

Summary

今天的 IT 系统正在生成、收集和处理比以往更多的数据。而且,他们正在处理高度复杂的流程(正在自动化)以及跨越典型组织边界的系统和设备之间的集成。同时,预计 IT 系统的开发速度更快、成本更低,同时还具有高可用性、可扩展性和弹性。为了实现这些目标,开发人员正在采用架构风格和编程范式,例如微服务、事件驱动架构、DevOps 等。正在构建新的工具和框架来帮助开发人员实现这些期望。开发人员正在结合事件驱动架构 (EDA) 和微服务架构风格来构建具有极强可扩展性、可用、容错、并发且易于开发和维护的系统。

EventMesh 作为事件基础设施,主要负责事件的传输、路由和序列化。它可以提供用于处理事件流的 API。事件基础设施提供对多种序列化格式的支持,并对架构质量(例如容错、弹性可伸缩性、吞吐量等)产生重大影响,也可以存储事件以创建事件存储,事件存储是恢复和弹性的关键架构模式。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
数据采集 存储 数据可视化
分布式爬虫框架Scrapy-Redis实战指南
本文介绍如何使用Scrapy-Redis构建分布式爬虫系统,采集携程平台上热门城市的酒店价格与评价信息。通过代理IP、Cookie和User-Agent设置规避反爬策略,实现高效数据抓取。结合价格动态趋势分析,助力酒店业优化市场策略、提升服务质量。技术架构涵盖Scrapy-Redis核心调度、代理中间件及数据解析存储,提供完整的技术路线图与代码示例。
2019 0
分布式爬虫框架Scrapy-Redis实战指南
|
11月前
|
人工智能 运维 Java
Flink Agents:基于Apache Flink的事件驱动AI智能体框架
本文基于Apache Flink PMC成员宋辛童在Community Over Code Asia 2025的演讲,深入解析Flink Agents项目的技术背景、架构设计与应用场景。该项目聚焦事件驱动型AI智能体,结合Flink的实时处理能力,推动AI在工业场景中的工程化落地,涵盖智能运维、直播分析等典型应用,展现其在AI发展第四层次——智能体AI中的重要意义。
3495 27
Flink Agents:基于Apache Flink的事件驱动AI智能体框架
|
11月前
|
消息中间件 监控 Java
Apache Kafka 分布式流处理平台技术详解与实践指南
本文档全面介绍 Apache Kafka 分布式流处理平台的核心概念、架构设计和实践应用。作为高吞吐量、低延迟的分布式消息系统,Kafka 已成为现代数据管道和流处理应用的事实标准。本文将深入探讨其生产者-消费者模型、主题分区机制、副本复制、流处理API等核心机制,帮助开发者构建可靠、可扩展的实时数据流处理系统。
913 4
|
安全 JavaScript 前端开发
HarmonyOS NEXT~HarmonyOS 语言仓颉:下一代分布式开发语言的技术解析与应用实践
HarmonyOS语言仓颉是华为专为HarmonyOS生态系统设计的新型编程语言,旨在解决分布式环境下的开发挑战。它以“编码创造”为理念,具备分布式原生、高性能与高效率、安全可靠三大核心特性。仓颉语言通过内置分布式能力简化跨设备开发,提供统一的编程模型和开发体验。文章从语言基础、关键特性、开发实践及未来展望四个方面剖析其技术优势,助力开发者掌握这一新兴工具,构建全场景分布式应用。
1216 35
|
消息中间件 存储 数据采集
Apache InLong:构建10万亿级数据管道的全场景集成框架
Apache InLong(应龙)是一站式、全场景海量数据集成框架,支持数据接入、同步与订阅,具备自动、安全、可靠和高性能的数据传输能力。源自腾讯大数据团队,现为 Apache 顶级项目,广泛应用于广告、支付、社交等多个领域,助力企业构建高效数据分析与应用体系。
|
监控 Java 调度
SpringBoot中@Scheduled和Quartz的区别是什么?分布式定时任务框架选型实战
本文对比分析了SpringBoot中的`@Scheduled`与Quartz定时任务框架。`@Scheduled`轻量易用,适合单机简单场景,但存在多实例重复执行、无持久化等缺陷;Quartz功能强大,支持分布式调度、任务持久化、动态调整和失败重试,适用于复杂企业级需求。文章通过特性对比、代码示例及常见问题解答,帮助开发者理解两者差异,合理选择方案。记住口诀:单机简单用注解,多节点上Quartz;若是任务要可靠,持久化配置不能少。
1197 4
|
存储 监控 数据可视化
常见的分布式定时任务调度框架
分布式定时任务调度框架用于在分布式系统中管理和调度定时任务,确保任务按预定时间和频率执行。其核心概念包括Job(任务)、Trigger(触发器)、Executor(执行器)和Scheduler(调度器)。这类框架应具备任务管理、任务监控、良好的可扩展性和高可用性等功能。常用的Java生态中的分布式任务调度框架有Quartz Scheduler、ElasticJob和XXL-JOB。
6173 66
|
Java 网络安全 Apache
SshClient应用指南:使用org.apache.sshd库在服务器中执行命令。
总结起来,Apache SSHD库是一个强大的工具,甚至可以用于创建你自己的SSH Server。当你需要在服务器中执行命令时,这无疑是非常有用的。希望这个指南能对你有所帮助,并祝你在使用Apache SSHD库中有一个愉快的旅程!
1063 29
|
分布式计算 Java 大数据
Java 大视界 —— 基于 Java 的大数据分布式计算在气象数据处理与天气预报中的应用进展(176)
本文围绕基于 Java 的大数据分布式计算在气象数据处理与天气预报中的应用展开,剖析行业现状与挑战,阐释技术原理,介绍其在数据处理及天气预报中的具体应用,并结合实际案例展示实施效果。
Java 大视界 -- 基于 Java 的大数据分布式存储在视频监控数据管理中的应用优化(170)
本文围绕基于 Java 的大数据分布式存储在视频监控数据管理中的应用展开,分析管理现状与挑战,阐述技术应用,结合案例和代码给出实操方案。

推荐镜像

更多