1 简介
事件驱动架构模式是一种主流的异步分发事件架构模式,常用于设计高度可拓展的应用。当然了,它有很高的适应性,使得它在小型应用、大型应用、复杂应用中都能表现得很好。
该模式具有高度适应性的分布式异步体系结构,此模式最适合具有高可伸缩性的小型到大型应用程序。
由于事件处理器组件在此模式中彼此隔离,因此可以在不影响其他组件性能的情况下对组件进行更改。
此模式有两个主要结构: 中介和代理结构.
事件(Event)是状态发生变化时软件发出的通知,结构图可以直接查看本文末尾。
2 事件中介模式 Mediator结构
事件驱动架构(Event-driven Architecture)是通过事件进行通信的软件架构,它分成四个部分
事件队列 Event Queue 接收事件的入口
事件分发器 Event Mediator 将不同的事件分发到不同的业务逻辑单元
事件通道 Event Channel 分发器和处理器的联系通道
事件处理器 Event Processor 实现业务逻辑,处理完后发出事件触发下一步
当事件具有多个步骤需要通过中央处理器进行某种程度协调时,将使用中介器。
当用户将初始事件发送到事件队列时,初始事件将定向到事件中介器。
事件驱动包含两种结构:
Mediator 用于多步骤事件需协调,由事件队列、分发器、通道和处理器组成;
Broker 则直接代理事件,无中间分发。
接收初始事件将提示事件中介器发布处理事件并将其发送到事件通信,告诉它们开始执行每个步骤。
从事件通道接收处理事件的事件处理器包括执行处理初始事件所需的全部步骤的业务逻辑组件。
通常事件处理器组件只执行单个业务任务,不依赖其他事件处理器,这是由于已设置事件处理器与其他处理器同步运行。
对于简单的项目,事件队列、分发器和事件通道可以合为一体,整个软件就分成事件代理
和事件处理器两部分。
3 事件代理结构 Broker结构
代理模式用于事件不需要中介分发或协调事件的流程。代理结构有两个主要组件:
代理人
事件处理器
代理组件包含此事件流的所有事件通道。这些事件通道可以是消息队列、消息主题或两者的组合。
在代理拓扑中,事件处理器组件直接接收事件,并负责处理和发布新事件以指示事件已处理。
事件连续流经处理器组件链,直到不再为初始事件发布事件。
这种进程分布允许事件驱动的体系结构以最小的资源消耗运行大量并发连接。
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架构
的设计思想和这两者有一定程度的相似。