首页 > 解决方案 > 同步关注点的事件溯源

问题描述

我很难理解如何使用可以支持同步请求的事件源来设计事件驱动的后端。据我了解,要利用事件溯源,您必须开发系统以对事件做出反应,以便在必要时可以重播它们以重新创建您的状态。为此,这意味着我们正在尝试解耦事件触发器和事件处理程序。

如果我们假设客户端正在发送更新某些数据的请求,我们如何在使用事件驱动系统时适应这种同步请求/响应模型?您是否会说以下步骤是以事件驱动的方式处理请求的正确方法:

  1. 在 API 网关或网络边缘的某些服务接收网络请求,并发出表示该请求的事件。此时的 API 网关将挂起并等待。

  2. 发出的事件由事件存储捕获并记录

  3. 具有处理更新的业务逻辑的服务在订阅事件存储时捕获事件。如果它能够处理更新,它会产生一个成功事件,如果它不能这样做,它会产生一个错误事件。

  4. API 网关接收它等待的成功或错误事件之一,最后将响应发送回浏览器。

我认为以上内容对分离关注点有很大帮助,但我怀疑这是否是通过接受来自外部客户端的请求的系统启用事件溯源的方式。

标签: architecturemicroservicesevent-driven-design

解决方案


您正在混淆几个术语和想法,这些术语和想法对于保持分开很重要。一旦你在脑海中分离了这些,一切都应该变得清晰。

事件溯源和事件驱动架构是两个不同的想法。事件溯源意味着您将对实体的所有更改保存在事件存储中,并获取该实体的当前状态,您可以将所有事件相加。这个概念涉及状态的存储,而不是请求的处理。我认为您在这个问题中所指的是事件驱动架构。将这些想法分开的必要性很快就会变得清晰。

在事件驱动架构中,有两个想法需要分开。有来自 UI 或外部系统的请求对数据进行一些更改;这是一条消息或请求。消息处理程序(通常在 CQRS 中称为命令)处理请求并以无效为由拒绝或对系统中的实体进行适当的更改。然后将这些实体的更改作为事件存储在事件存储中。Event Store 中的事件应该只包含发生变化的数据,而不是实体的所有属性。如果命令更改了多个实体,则会将多个事件写入事件存储。

系统可以有事件存储的侦听器(或订阅者),并且可以启动其他业务逻辑以响应实体的变化。这些更改以最终一致的方式异步运行。

考虑到所有这些,我们可以讨论事件驱动架构如何处理同步和异步事件。请记住,EDA 是为异步处理和最终一致性而设计的,因此使其同步需要一些额外的工作。

使用上面的 4 个步骤,我们得到了这个

第 1 步:不更改描述的逻辑。网关接收请求(不是事件)并等待。

第 2 步:一些开发人员喜欢存储传入的请求以进行模式分析等,但不一定要成功处理请求。

在最终一致的架构中,业务逻辑将对传入请求进行一些基本验证,如果看起来不错,则发回操作成功的确认。该请求将被放入队列并在方便时进行处理。如果遇到错误,稍后会通知用户。

但是由于您的系统是同步的,API(您称之为“API 网关”)将直接调用负责处理业务逻辑的服务——命令。

第 3 步:请求由命令处理,验证请求并对实体进行任何必要的更改。为所有实体更改创建事件(每个实体一个事件)。

第 4 步:该命令将成功或失败值同步返回给 API,API 将其返回给调用者。请注意,这应该是一个 async/await 调用,而不是来自 API 的阻塞调用。对于 API 和用户来说,它仍然看起来像一个同步过程。


推荐阅读