事件驱动架构:原理、模式与实现
立即解锁
发布时间: 2025-08-20 02:30:45 阅读量: 3 订阅数: 6 


现代数据管理与架构:从理论到实践
# 事件驱动架构:原理、模式与实现
## 1. 事件驱动架构简介
事件驱动的数据架构是一种新的范式,组织可以利用它将业务转变为实时、数据驱动的体验。不过,尽管它功能强大,但也过于复杂,需要许多服务、额外的组件和框架,并且并非适用于所有类型的问题。在实施任何类型的事件驱动通信时,讨论这些考虑因素是很有价值的。
### 1.1 事件数据的特点
事件数据是关于某个时间点发生的变化(即事件)的信息。它为组织提供了竞争优势,更快的结果使洞察更具相关性,更高的响应能力带来更高的客户满意度。与离线批量交付或响应 API 请求(实时)的数据不同,事件数据专注于与事件进行交互和响应,强调高吞吐量,并且可以是无状态或有状态的。它允许在特定时间点交换有关变化的信息,并在不同位置之间移动应用程序状态,从而实现分布式、最新的物化视图。
事件数据的来源广泛,包括物联网(IoT)设备、智能手机点击、游戏玩家活动、社交网络以及传统运营系统的更改等。
### 1.2 事件流平台的功能
事件驱动架构通常使用事件流平台,这些平台在数据流经时处理传入的事件。这些软件平台具有不同的“面貌”,支持各种功能,例如:
- 执行实时 ETL 和数据集成过程,以操纵事件流。
- 对事件窗口进行分析,以检测模式或相关性,从而运行实时分析。
- 实时存储数据并在存储位置之间移动数据。
- 触发函数并向其他系统发出更新。
由于事件驱动模式与数据产品的存储方式和 API 的使用方式存在重叠,因此需要良好的数据管理。例如,一个事件可能会触发对许多不同服务的大量消息或调用,从数据管理的角度来看,需要能够跟踪所有这些调用的回复。
## 2. 事件通知与状态携带
### 2.1 事件携带状态转移
一种分发事件的方法是事件携带状态转移。在这种方法中,事件本身携带与更改相关的完整状态,因此消费者拥有所需的所有信息,在收到事件通知后无需单独请求状态。消费者甚至可以使用这些事件来构建自己的数据本地副本。以下是一个“添加客户”事件携带完整状态的示例:
```json
{
"id": "321125215",
"firstName": "Adolfo",
"lastName": "Prosacco",
"gender": "male",
"birthday": "1997-05-01",
"address": {
"streetAddress": "17795 Louisiana 182",
"city": "Baldwin",
"state": "Louisiana",
"postalCode": "70514",
"country": "United States"
},
"phoneNumber": [
{
"type": "home",
"number": "(813) 872-1350"
},
{
"type": "mobile",
"number": "(202) 555-0154"
}
]
}
```
### 2.2 仅发送事件通知
另一种方法是仅发送事件通知,而不携带完整状态。在这种情况下,事件仅包含最少的信息:对已更改状态的引用。以下是一个表示客户更改通知的事件示例:
```json
{
"id": "321125215"
}
```
通知的目的是让消费者做出反应并执行某些操作。从数据管理的角度来看,这类事件可能不太有趣,但从企业集成的角度来看,当事件跨越域边界时,肯定需要设定遵循的标准。
## 3. 异步通信模型
请求/响应通信和事件驱动通信的关键区别在于数据传输的对话性质是相反的。在事件驱动通信中,需要倾听而不是说话,这也是复杂性所在,因为大多数用户不熟悉这种思维方式。我们中的许多人在采取行动时期望立即得到响应,同步通信(即发出请求并得到响应)感觉更自然。
### 3.1 长轮询技术
流式客户端通常与平台建立连接,并等待内容被推送和交付。这种通信模型中的连接有一个有限的生命周期,在此期间可以交换数据。在这个周期结束时,所有连接必须关闭并清理资源。一种比反复打开和关闭连接更有效的通信方式是尽可能长时间地保持连接打开,这种技术称为长轮询。
### 3.2 异步通信的优势
反应式通信需要不同的思维方式:等待有人联系然后采取行动。应用程序和集成平台可以对事件采用相同的方式,将事件或消息发送到消息队列,然后等待另一个应用程序拾取。这种松耦合消除了等待对方立即反应的依赖性,因此在可以等待的情况下,异步通信使架构更具弹性。
## 4. 现代事件驱动架构的形式
事件驱动架构(EDAs)中,事件在应用程序之间分发,可以根据需求以不同的方式实现。许多平台和服务提供不同的功能集,有些服务高度专业化并排除某些功能,而另一些则试图尽可能全面。以下是一些常见的实现方式:
### 4.1 消息队列
消息队列是一种在应用程序之间共享事件的知名方法。顾名思义,消息队列是一个队列,事件或消息可以在其中停留直到被处理。它已经在消息处理中使用了多年,可以用于促进不同的通信风格。一个常见的例子是点对点消费模型,其中发布者将消息发送到队列,订阅者从队列中拉取消息。消息队列(有时也称为消息代理)可以高速工作。为确保消息仅被处理一次,在消费者确认收到后,消息会被删除或标记。
消息队列通常用于事务性或高完整性的事件处理,例如,当确保每条消息仅被处理一次或按特定顺序(通常是先进先出)处理很重要时,或者当需要交付保证和用于存储未交付消息的死信队列等功能时。
### 4.2 事件代理
另一种在应用程序之间共享事件的方法是使用事件代理。事件代理是一种轻量级的中间件,允许不同语言编写或使用不同协议实现的应用程序之间直接通信。事件代理通常验证、存储、路由并直接将事件交付到其他目的地,充当应用程序之间的中介。
事件驱动平台和服务组织事件的方式类似于文件系统中文件夹组织文件的方式,它们对事件分组的结构使用不同的名称。
0
0
复制全文
相关推荐










