聊一聊事件源与事件驱动架构

文摘   2024-10-18 00:02   中国  

1 引言

在当今的软件开发领域,事件驱动架构和事件源架构因其在不同场景下的广泛应用而日益受到青睐。尽管这两种架构都涉及到事件的使用,但它们在概念和应用上有着本质的区别。本文旨在探讨这两种架构的关键特征,阐明它们之间的差异,并讨论它们如何相互补充。我们将重点放在区分这两个概念上,而不是深入探讨每个概念的细节。

在深入讨论之前,让我们先对事件驱动和事件源系统中的“事件”一词进行定义。在这些上下文中,事件被定义为对已经发生的事实的不可变记录。这意味着一旦事件被创建,其包含的数据就不能被更改。不变性对过去事实的描述是这些系统中事件的基本属性。

2 事件驱动(Event-Driven)

事件驱动架构(Event-Driven Architecture,EDA)是一种软件架构风格,它依赖于事件作为系统组件之间或不同系统之间的主要通信机制。在这种架构中,事件的产生、检测、消费和反应是核心活动,事件通常以异步方式处理,发布者在发布事件后不会等待接收者的响应。这种“发布-忘记”(fire-and-forget)的模式允许系统的不同部分订阅并处理事件,从而触发可能由更多事件组成的复杂工作流。

  • 事件通过发布-订阅模式进行传播,允许多个接收者同时对同一事件做出响应。

  • 每个接收者都会收到事件的独立副本。

  • EDA的异步特性通常导致系统状态的最终一致性,这意味着组件之间的状态更新可能不会立即同步。

  • EDA系统通常(但不是总是)使用消息代理来传递事件,从而实现发布者和接收者之间的解耦。

  • 组件通常处理两种类型的事件:领域事件(domain events)和集成事件(integration events)。领域事件是组件内部的事件,而集成事件则用于组件之间的通信。

  • 在许多系统中,大多数(如果不是全部)组件都会参与到事件的发布和订阅中,每个组件都会发布和订阅事件的一个子集。

这种架构风格特别适合于需要高度解耦、可扩展性和响应性的系统,例如基于微服务的架构。通过使用事件驱动的方法,系统可以更加灵活地响应变化,并且能够更好地处理分布式环境中的复杂交互。

3 事件源(Event Sourcing)

事件源(ES)是一种软件架构模式,它将事件作为持久化机制的核心。在这种模式下,实体的状态变化不是直接存储为当前状态,而是通过一系列事件来记录。这些事件反映了实体状态的变更历史,并可以用来重建实体的当前状态。例如,在电子商务系统中,对购物车执行的一系列操作(如添加或删除商品)会产生相应的事件:

  • 购物车已创建

  • 商品已添加

  • 商品已添加

  • 商品已删除

  • 商品已添加

通过按时间顺序重新播放这些事件,可以重建购物车的状态。在这个例子中,最终的购物车将包含两件商品。

事件源的关键特征包括:

  • 实体在完成操作后会包含一系列新的事件,这些事件反映了状态的变更,并被保存到事件存储中。

  • 事件与特定的实体紧密关联,并且通常以高度一致的方式处理。如果在处理过程中有其他进程同时向事件流中添加事件,可能会导致不一致。

  • 新事件的持久化通常是原子性的——要么所有事件都被保存,要么都不保存。

  • 通过从事件流中加载事件来重建实体的状态。

  • 事件源的范围通常限于单个组件。在更大的系统中,可以存在异构的持久化机制,其中只有部分组件使用事件源。

4 不同但互补

在比较事件驱动架构(EDA)和事件源(ES)时,可以明显看出它们在软件设计中解决的问题是不同的。EDA是一种软件架构风格,而ES是一种软件架构模式。尽管它们在本质上不同,但这并不意味着它们不能共存。实际上,EDA和ES经常结合使用,相互补充。

在这样的系统中,使用事件源的组件处理业务逻辑,并通过事件来持久化实体的状态。在某些操作完成后,可能会发布一个事件,表明对其他参与EDA的组件可能感兴趣的操作已经完成。这个事件可以是单一事件,也可以是多个事件的数据聚合,需要在其他组件中进一步处理。无论哪种情况,发布者都会将这个事件映射到一个集成事件并发布它,从而允许在其他组件中使用。

EDA和ES的不同性质也是它们的优势所在——每种方法都专注于不同的领域,但它们共同构成了更广泛的系统。事件源提供了一个组件中变更的审计跟踪和细节,而事件驱动架构则利用这些信息将选定的变更传达给其他组件。

5 软件架构风格 vs. 软件架构模式

在软件架构领域,"风格"(Style)和"模式"(Pattern)这两个术语经常被使用,但它们的含义和用途有所不同。以下是对这两个概念的澄清:

软件架构风格(Architectural Style)

软件架构风格是一种高层次的设计概念,它定义了系统应该如何组织和构建。它提供了一组设计原则和模式,这些原则和模式共同指导了系统组件的设计和它们之间的交互方式。架构风格通常关注于系统的结构和组件之间的通信机制,而不是单个组件的内部实现细节。

架构风格的例子包括:

  • 微内核(Microkernel)

  • 事件驱动架构(Event-Driven Architecture, EDA)

  • 微服务(Microservices)

  • 客户端-服务器(Client-Server)

  • 管道和过滤器(Pipe-and-Filter)

软件架构模式(Architectural Pattern)

软件架构模式是一种在特定上下文中解决特定问题的通用解决方案。它提供了一种经过验证的方法来组织软件架构的某些方面,以满足特定的质量属性或业务需求。架构模式通常更加具体,它们描述了在特定情况下如何实现架构风格。

架构模式的例子包括:

  • MVC(Model-View-Controller):用于实现用户界面的分离关注点。

  • CQRS(Command Query Responsibility Segregation):用于分离读和写操作,以提高性能和可伸缩性。

  • 事件源(Event Sourcing):用于持久化应用程序状态变更历史的一种模式。

区别

  • 抽象层次:架构风格通常比架构模式更抽象。风格提供了一个宽泛的框架,而模式提供了具体的实现指导。

  • 应用范围:架构风格定义了整个系统的组织方式,而架构模式通常只适用于系统的特定部分或特定问题。

  • 灵活性:由于架构风格的抽象性,它们提供了更多的设计灵活性。架构模式则提供了更具体的设计决策,这可以减少设计的灵活性,但同时也减少了设计时的复杂性。

在讨论事件驱动架构(EDA)和事件源(ES)时,我们可以这样区分:

  • 事件驱动架构(EDA) 是一种架构风格,它定义了系统组件之间如何通过事件进行通信。

  • 事件源(ES) 是一种架构模式,它提供了一种具体的机制来持久化和重建系统状态,通常作为事件驱动架构的一个组成部分。

这种区分有助于更清晰地理解这两种概念在软件架构中的作用和应用。


架构师之道
研究企业架构,研究企业数字化转型,跟踪和探索云计算、大数据、工业互联网、物联网、区块链等领域的最新动向和技术分享,帮助架构师进阶首席科学家!
 最新文章