淺談事件驅(qū)動(dòng)架構(gòu)(EDA)的概念及關(guān)鍵組件
近年来,事件驱动架构已经变得非常流行,在开发高度可扩展的分布式系统方面。它是一种设计软件的方式,其中不同部分通过发送和响应事件来通信。
一个事件就是发生的事情,比如,
- 用户注册
- 用户上传照片
- 支付完成,
系统中不同的部分不会直接向彼此发出请求,而是关注这些事件,并在需要时进行回应(异步)。
比如说:
- _支付服务模块_完成并触发“支付完成”的事件。
- _库存服务_响应该事件并更新新购商品的库存。
- _邮件服务_响应并发送确认邮件。
我们来看看事件驱动架构中的组件的一个非常简单的图。
关键要素1. 事件生产者/发布者
当某些事情发生时创建并发布事件的系统或服务。
示例:当一个新用户注册时,用户服务会发送一个“用户注册”的事件。
2. 消息代理
消息代理是一种中间件,它位于事件生产者和事件消费者之间。其主要作用是高效地接收、存储和转发事件,确保事件准确无误地送达合适的消费者服务。
在这一背景下,消息代理里有一个关键的概念叫做信道。这些信道充当通信路径,协调从生产者到相应消费者的事件流动。
- 在 Kafka 中,这些通道被称作 主题。它支持 多订阅者模型,允许多个消费者从同一个发布者接收消息。
- 在 RabbitMQ 中,这些通道被称作 队列。RabbitMQ 的队列通常是 点对点 的,这意味着一个队列中的消息只能由一个消费者接收和处理。
示例技术:Kafka、RabbitMQ、AWS SNS/SQS(亚马逊SNS/SQS)、Google Pub/Sub(谷歌Pub/Sub)。
3. 事件消费者/订阅者
监听事件并作出反应的服务。
例如:通知服务监听“用户注册”的事件并发送一封欢迎邮件。
4. 事件
描述实际发生的事件的消息。它通常包含结构化数据,比如 JSON 或 XML。
例如:示例事件消息:
{
"数据": {
"id": "event-123456",
"类型:": "注册事件",
"时间戳": "2025-04-01T12:00",
"属性": {
"id": "usr-98765",
"电子邮件": "user@example.com",
"姓氏": "example",
}
}
}
切换到全屏,退出全屏
经纪交易平台交换是一种机制,决定消息如何进入队列。不同类型的交换提供了不同的消息分发方式。
直接交换(一对一路由)
基于路由键和队列绑定键(RabbitMQ)的精确匹配将消息路由到队列。
它是怎样工作的?
- 生产者发送一条带有路由键的消息。
- 交换机只会把消息转发给那些绑定关键字匹配的队列。
示例:
带有路由键为 "order.created"
的消息只会发送到绑定的队列。
如图所示
Fanout 交换器(广播)
将消息广播到所有绑定的队列,忽略路由键,就像在RabbitMQ-Fanout交换器中一样
(RabbitMQ-Fanout 交换器 | Kafka-每个主题可以有多个消费者)。
它是怎么工作的?
- 生产者发送了一条消息。
- 交换器将消息转发到所有绑定的队列。
例如:
通知事件会被广播到多个服务(电子邮件、短信、以及推送通知)。
主题交换(模式匹配)
根据路由键中的通配符模式来分发消息。支持用*
匹配一个词,用#
匹配多个词。(例如RabbitMQ的主题交换和Kafka的带分区键的主题)。
它是怎么工作的?
- 使用
.
用法来分隔 routing key 中的单词,例如"order.payment.failed"
。
示例:
绑定到的队列会接收 "order.*"
,并且会接收 "order.created"
和 "order.cancelled"
,但是不会接收 "user.created"
。
看起来是一张图片,点击可以查看。
- 可扩展性:解耦的服务可以各自扩展。
- 灵活性:无需改动现有服务,就可以轻松添加新的事件消费者。
- 实时处理:支持实时数据流处理,并能够快速响应。
- 弹性:只要妥善管理事件和订阅,一个服务的故障就不会影响整个系统。
- 松耦合:组件通过事件进行交互,从而减少了依赖性。
- 最终的一致性:系统不同部分可能会暂时持有过时的信息,直到所有事件都被处理。
- 调试难度大:在多个异步事件之间追踪问题变得更加困难。
- 延迟增加:由于异步的特性,某些事件可能需要更长的时间来处理。
- 重复事件:需要幂等性来避免重复处理。
- 某些代理(如RabbitMQ)不能保证消息的顺序:一些代理不能保证消息的顺序。
- 需要学习事件驱动的设计模式:需要掌握事件驱动的设计模式。
如果你打算实现一个分布式、实时且高度可扩展的系统,你一定要考虑实现一个事件驱动的架构,来充分利用它带来的所有好处。
共同學(xué)習(xí),寫下你的評論
評論加載中...
作者其他優(yōu)質(zhì)文章