事件驱动架构
目录
- 概述
- 什么是事件?
- 结偶与松散耦合
- 事件驱动架构的工作原理
- 事件驱动架构模型
- 事件驱动架构的优势
- Rabbitmq
- RabbitMQ 在 EDA 中的角色
- RabbitMQ vs. 其他消息队列
概述
事件驱动架构是一种用于应用设计的软件架构和模型。事件驱动系统旨在捕获、沟通和处理解耦服务之间的事件。这意味着,系统可以保持异步,同时仍共享信息和完成任务。
许多现代应用设计都是由事件驱动的,例如必须实时利用客户数据的客户互动框架。事件驱动应用可以用任何一种编程语言来创建,因为事件驱动本身是一种编程方法,而不是一种编程语言。事件驱动架构支持最小程度的耦合,因此非常适合现代分布式应用架构。
EDA 采用松散耦合方式,因为事件发起者并不知道哪个事件使用者在监听事件,而且事件也不知道其所产生的后续结果。
什么是事件?
事件用于记录系统硬件或软件的任何重要事件或状态变更。事件与事件通知不同,事件通知是由系统发送的消息或通知,用于通知系统的另一方发生了事件。
事件源可能来自于内部输入,也可能是外部输入。事件可以由用户生成,例如单击鼠标或按键;也可以是外部来源,例如传感器输出;或来自于系统,例如加载程序。
结偶与松散耦合
解耦与松散耦合指的是软件架构和事件驱动系统中两个相关但不同的概念。
解耦是消除或最小化系统中独立组件之间的直接依赖关系的做法,以便组件之间不存在“唇亡齿寒”的关系。在 EDA 的语境下,通过确保生成事件的组件只需发送事件数据,而不必考虑特定的使用者组件,从而实现解耦。这种“断联”使组件彼此独立,创造出总体更灵活的系统。
松散耦合是一种特定形式的解耦,旨在降低组件之间的相互依赖的程度,而不是将它们完全分离开。在松散耦合的系统中,组件可能会彼此交互,但不会导致形成任何形式的依赖关系。
这两种系统都有利于提高灵活性和独立性,进而创造出敏捷且可扩展的系统。
事件驱动架构的工作原理
事件驱动架构由事件发起者(发布者)和事件使用者(订阅者)组成。事件发起者检测或感知事件,并以消息的形式呈现事件。由于是解耦系统,它不知道事件的使用者,也不知道事件的结果。
检测到事件后,将从事件发起者通过事件通道将事件传输给事件使用者,在事件通道中,事件处理平台会异步处理事件。发生事件时,需要通知事件使用者。他们可能会处理事件,也可能只是会受到事件影响。
事件处理平台将执行正确的事件响应,并将活动发送给下游正确的使用者。该下游活动即看到事件结果的位置。
Apache Kafka 是一个分布式数据流平台,是备受欢迎的事件处理解决方案。它能够实时处理事件流的发布、订阅、存储和处理。Apache Kafka 支持各种重视高吞吐量和可扩展性的用例,通过最大程度减少某些应用中对数据共享的点对点集成需求,因而可以将延迟降至毫秒级。
除此之外,还有其他一些中间件事件管理器也可用作事件处理平台。
事件驱动架构模型
事件驱动架构可以基于发布/订阅模型或事件流模型。
发布/订阅模型
这是基于事件流订阅的消息传递基础架构。借助该模型,在事件发生或发布后,事件将发送给需要通知的订阅者。
事件流模型
借助事件流模型,事件会被写入日志。事件使用者无需订阅事件流。相反,他们可以读取事件流的任何部分,并可以随时加入事件流。
事件流有几种不同的类型:
事件流处理会使用数据流平台(如 Apache Kafka)获取事件,并处理或转换事件流。
简单事件处理是指事件会立即触发事件使用者行动的情形。
复杂事件处理需要事件使用者处理一系列事件才能检测到模式。事件流处理可用于检测事件流中有意义的模式。
事件驱动架构的优势
EDA 可以帮助企业实现灵活的系统,能够通过适应变化并实时做出决策来改进工作流。实时情境感知意味着企业决策(无论是手动还是自动化)都可以使用能够反映系统当前状态的所有可用数据来做出决定。
当物联网(IoT)设备、应用和网络等事件源发生事件时,事件便会被捕获,使事件发起者和事件使用者能够实时共享状态和响应信息。
企业可以向其系统和应用添加事件驱动架构,提高应用的可扩展性和响应速度,改善对数据和背景信息的访问以做出更明智的业务决策。
事件驱动架构提供解耦优势,数据或服务的发起者和使用者不需要直接沟通,因此有利于打造更灵活且扩展性高的系统。进而进一步简化新组件的集成,提高容错性和系统的整体效率。
Rabbitmq
RabbitMQ 是事件驱动架构(EDA)中事件通道的典型实现,属于消息队列(Message Queue)中间件。它通过发布 - 订阅模式(Pub/Sub)实现组件间的解耦,是构建事件驱动系统的核心工具之一。
RabbitMQ 在 EDA 中的角色
- 事件通道
RabbitMQ 作为中间层,接收生产者发送的事件(消息),并将其路由到对应的消费者。 - 支持多种消息模式
工作队列(Work Queue):多个消费者竞争处理同一类事件(负载均衡)。
发布 - 订阅(Publish/Subscribe):一个事件被多个消费者同时接收。
路由(Routing):按规则(如事件类型)将事件路由到特定队列。
主题(Topics):基于模糊匹配(如order.#)订阅事件。 - 保证事件可靠性
支持持久化(Persistence):事件可存储到磁盘,避免 Broker 崩溃导致数据丢失。
确认机制(Ack):消费者处理完事件后向 RabbitMQ 确认,未确认的事件会重新分发。
RabbitMQ vs. 其他消息队列
特性 | RabbitMQ | Kafka |
---|---|---|
消息模式 | 支持多种(直连、主题、扇形等) | 基于发布 - 订阅的事件流处理 |
吞吐量 | 中等(万级 TPS) | 极高(百万级 TPS) |
消息持久化 | 支持(基于磁盘) | 高吞吐量持久化(顺序写磁盘) |
适用场景 | 企业级消息系统、复杂路由 | 大数据、实时流处理、日志收集 |