事件驱动作为分布式异步服务架构

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 【6月更文挑战第25天】本文介绍事件驱动架构(EDA)是异步分布式设计的关键模式,适用于高扩展性需求。EDA提升服务韧性,支持CQRS、数据通知、开放式接口和事件流处理。然而,其脆弱性包括组件控制、数据交换、逻辑关系复杂性、潜在死循环和高并发挑战。EDA在云原生环境,如Serverless,中尤其适用。

1 简介

事件驱动架构模式是一种主流的异步分发事件架构模式,常用于设计高度可拓展的应用。当然了,它有很高的适应性,使得它在小型应用、大型应用、复杂应用中都能表现得很好。

该模式具有高度适应性的分布式异步体系结构,此模式最适合具有高可伸缩性的小型到大型应用程序。

由于事件处理器组件在此模式中彼此隔离,因此可以在不影响其他组件性能的情况下对组件进行更改。

此模式有两个主要结构: 中介和代理结构.

事件(Event)是状态发生变化时软件发出的通知,结构图可以直接查看本文末尾。

2 事件中介模式 Mediator结构

事件驱动架构(Event-driven Architecture)是通过事件进行通信的软件架构,它分成四个部分

事件队列 Event Queue  接收事件的入口
事件分发器 Event Mediator 将不同的事件分发到不同的业务逻辑单元
事件通道   Event Channel  分发器和处理器的联系通道
事件处理器 Event Processor  实现业务逻辑,处理完后发出事件触发下一步

当事件具有多个步骤需要通过中央处理器进行某种程度协调时,将使用中介器。
当用户将初始事件发送到事件队列时,初始事件将定向到事件中介器。

事件驱动包含两种结构:

   Mediator 用于多步骤事件需协调,由事件队列、分发器、通道和处理器组成;
   Broker 则直接代理事件,无中间分发。

接收初始事件将提示事件中介器发布处理事件并将其发送到事件通信,告诉它们开始执行每个步骤。
从事件通道接收处理事件的事件处理器包括执行处理初始事件所需的全部步骤的业务逻辑组件。

image.png

通常事件处理器组件只执行单个业务任务,不依赖其他事件处理器,这是由于已设置事件处理器与其他处理器同步运行。

对于简单的项目,事件队列、分发器和事件通道可以合为一体,整个软件就分成事件代理
和事件处理器两部分。

3 事件代理结构 Broker结构

代理模式用于事件不需要中介分发或协调事件的流程。代理结构有两个主要组件:

代理人
事件处理器

代理组件包含此事件流的所有事件通道。这些事件通道可以是消息队列、消息主题或两者的组合。

在代理拓扑中,事件处理器组件直接接收事件,并负责处理和发布新事件以指示事件已处理。

事件连续流经处理器组件链,直到不再为初始事件发布事件。

这种进程分布允许事件驱动的体系结构以最小的资源消耗运行大量并发连接。

image.png

4 优点

事件驱动架构(EDA,Event DrivenArchitecture)本质上是一种应用/组件间的集成架构模式。

事件和传统的消息不同,事件具有schema,所以可以校验event的有效性,同时EDA具备QoS保障机制,也能够对事件处理失败进行响应。事件驱动架构不仅用于(微)服务解耦,还
可应用于下面的场景中。

(1)增强服务韧性 

由于服务间是异步集成的,也就是下游的任何处理失败甚至宕机都不会被上游感知,自然也就不会对上游带来影响。

(2)CQRS(Command Query Responsibility Segregation):把对服务状态有影响的命令用事件来发起。而对服务状态没有影响的查询才使用同步调用的API接口;

结合EDA中的EventSourcing机制可以用于维护数据变更的一致性,当需要重新构建服务状态时,把EDA中的事件重新“播放”一遍即可。

(3)数据变化通知 

在服务架构下,往往一个服务中的数据发生变化,另外的服务会感兴趣,比如用户订单完成后,积分服务、信用服务等都需要得到事件通知并更新用户积分和信用等级。

(4)构建开放式接口

在EDA下,事件的提供者并不用关心有哪些订阅者,不像服务调用的场景——数据的产生者需要知道数据的消费者在哪里并调用它,因此保持了接口的开放性。

(5)事件流处理

应用于大量事件流(而非离散事件)的数据分析场景,典型应用是基于Kafka的日志处理。

基于事件触发的响应:在IoT时代大量传感器产生的数据,不会像人机交互一样需要等待处理结果的返回,天然适合用EDA来构建数据处理应用。

5 弱点

事件驱动架构的脆弱性主要表现在:

(1)组件的脆弱性。组件削弱了自身对系统的控制能力,一个组件触发事件,并不能确定
响应该事件的其他组件及各组建的执行顺序。

(2)组件间交换数据的脆弱性。组件不能很好地解决数据交换问题,事件触发时,一个
组件有可能需要将参数传递给另一个组件,而数据量很大的时候,如何有效传递是一个脆弱性
问题。

(3)组件间逻辑关系的脆弱性。事件架构使系统中各组件的逻辑关系变得更加复杂。

(4)事件驱动容易进入死循环,这是由编程逻辑决定的。

(5)高并发的脆弱性。虽然事件驱动可实现有效利用CPU资源,但是存在高并发事件处理
造成的系统响应问题,而且,高并发容易导致系统数据不正确、丢失数据等现象。

(6)固定流程的脆弱性。因为事件驱动的可响应流程基本都是固定的,如果操作不当,容
易引发安全问题,

6 小结

事件驱动架构是一种流行的分布式异步架构,是一种适合高扩展工程的、较流行的分布式
异构架构模式,有较高柔性,它由高度解耦、单一目的异步接收的事件处理组件和处理事件组
成。

事件驱动架构通常有两种拓扑结构:Mediator结构和Broker结构,

Mediator结构通常适用于事件的多个步骤需要通过中间角色来指挥和协调的情形。

Broker结构适用于事件是链式关系而不需要中间角色的情形。

云原生应用Serverless非常适合于事件驱动的数据计算任务、计算时间短的请求/响应应用、没有复杂相互调用的长周期任务。

云原生Lambda架构的诞生离不开很多现有设计思想和架构的铺垫,如事件溯源(Event Sourcing)
架构和命令查询分离(Command Query Responsibility Segregation,CQRS)架构,Lambda架构
的设计思想和这两者有一定程度的相似。

目录
相关文章
|
3月前
|
消息中间件 Java Kafka
Java 事件驱动架构设计实战与 Kafka 生态系统组件实操全流程指南
本指南详解Java事件驱动架构与Kafka生态实操,涵盖环境搭建、事件模型定义、生产者与消费者实现、事件测试及高级特性,助你快速构建高可扩展分布式系统。
208 7
|
3月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
558 3
|
4月前
|
人工智能 Kubernetes 数据可视化
Kubernetes下的分布式采集系统设计与实战:趋势监测失效引发的架构进化
本文回顾了一次关键词监测任务在容器集群中失效的全过程,分析了中转IP复用、调度节奏和异常处理等隐性风险,并提出通过解耦架构、动态IP分发和行为模拟优化采集策略,最终实现稳定高效的数据抓取与分析。
Kubernetes下的分布式采集系统设计与实战:趋势监测失效引发的架构进化
|
21天前
|
缓存 Cloud Native 中间件
《聊聊分布式》从单体到分布式:电商系统架构演进之路
本文系统阐述了电商平台从单体到分布式架构的演进历程,剖析了单体架构的局限性与分布式架构的优势,结合淘宝、京东等真实案例,深入探讨了服务拆分、数据库分片、中间件体系等关键技术实践,并总结了渐进式迁移策略与核心经验,为大型应用架构升级提供了全面参考。
|
4月前
|
消息中间件 负载均衡 中间件
⚡ 构建真正的高性能即时通讯服务:基于 Netty 集群的架构设计与实现
本文介绍了如何基于 Netty 构建分布式即时通讯集群。随着用户量增长,单体架构面临性能瓶颈,文章对比了三种集群方案:Nginx 负载均衡、注册中心服务发现与基于 ZooKeeper 的消息路由架构。最终选择第三种方案,通过 ZooKeeper 实现服务注册发现与消息路由,并结合 RabbitMQ 支持跨服务器消息广播。文中还详细讲解了 ZooKeeper 搭建、Netty 集群改造、动态端口分配、服务注册、负载均衡及消息广播的实现,构建了一个高可用、可水平扩展的即时通讯系统。
434 0
|
1月前
|
存储 NoSQL 前端开发
【赵渝强老师】MongoDB的分布式存储架构
MongoDB分片通过将数据分布到多台服务器,实现海量数据的高效存储与读写。其架构包含路由、配置服务器和分片服务器,支持水平扩展,结合复制集保障高可用性,适用于大规模生产环境。
201 1
|
2月前
|
消息中间件 缓存 监控
中间件架构设计与实践:构建高性能分布式系统的核心基石
摘要 本文系统探讨了中间件技术及其在分布式系统中的核心价值。作者首先定义了中间件作为连接系统组件的"神经网络",强调其在数据传输、系统稳定性和扩展性中的关键作用。随后详细分类了中间件体系,包括通信中间件(如RabbitMQ/Kafka)、数据中间件(如Redis/MyCAT)等类型。文章重点剖析了消息中间件的实现机制,通过Spring Boot代码示例展示了消息生产者的完整实现,涵盖消息ID生成、持久化、批量发送及重试机制等关键技术点。最后,作者指出中间件架构设计对系统性能的决定性影响,
|
5月前
|
监控 算法 关系型数据库
分布式事务难题终结:Seata+DRDS全局事务一致性架构设计
在分布式系统中,CAP定理限制了可用性、一致性与分区容错的三者兼得,尤其在网络分区时需做出取舍。为应对这一挑战,最终一致性方案成为常见选择。以电商订单系统为例,微服务化后,原本的本地事务演变为跨数据库的分布式事务,暴露出全局锁失效、事务边界模糊及协议差异等问题。本文深入探讨了基于 Seata 与 DRDS 的分布式事务解决方案,涵盖 AT 模式实践、分片策略优化、典型问题处理、性能调优及高级特性实现,结合实际业务场景提供可落地的技术路径与架构设计原则。通过压测验证,该方案在事务延迟、TPS 及失败率等方面均取得显著优化效果。
307 61
|
6月前
|
监控 Linux 应用服务中间件
Linux多节点多硬盘部署MinIO:分布式MinIO集群部署指南搭建高可用架构实践
通过以上步骤,已成功基于已有的 MinIO 服务,扩展为一个 MinIO 集群。该集群具有高可用性和容错性,适合生产环境使用。如果有任何问题,请检查日志或参考MinIO 官方文档。作者联系方式vx:2743642415。
1949 57
|
4月前
|
文字识别 运维 监控
架构解密|一步步打造高可用的 JOCR OCR 识别服务
本文深入解析了JOCR OCR识别服务的高可用架构设计,涵盖从用户上传、智能调度、核心识别到容错监控的完整链路,助力打造高性能、低成本的工业级OCR服务。
202 0
架构解密|一步步打造高可用的 JOCR OCR 识别服务