绕开事件驱动架构5个坑

事件驱动架构 (EDA) 并不是什么新鲜事物,如果您四处搜索,您一定会找到很多有关此架构概念的信息。

您会了解企业服务总线 (ESB) 或队列的差异、领域驱动设计 (DDD) 的重要性,甚至找到有关如何编码流、实现连接器、使用架构注册表等的指南。

但是,关于 EDA 实践、如何在完整的微服务环境中开始实施 EDA、如何与旧组件和新组件集成的文章并不多。以及如何治理这片土地。

Cymo,我们帮助多个客户克服了这些挑战,并在此过程中发现了许多陷阱。在此博客中,我们列出了我们认为最重要的 5 个内容:

1.使您的主题与您的业务领域保持一致
您可能熟悉队列或企业服务总线 (ESB),并且具有在这些系统上生成事件的经验。您甚至可能在主题命名上花了很多心思。但情况并非总是如此,因为您通常知道谁将使用数据并快速与感兴趣的各方就主题名称达成一致。

使用 EDA,您可以使用事件中心存储事件。事件会存储更长的时间,有些事件甚至配置为无限保留。这会导致事件被最初生成事件时不存在的新应用程序使用。因此,以明确的命名约定来组织活动主题变得尤为重要。

至少您应该在主题名称中包含业务领域。不仅是为了清晰,也是为了排序。与同一域实体相关的业务事件必须存储在同一主题中以保证排序。

这就是DDD(领域驱动设计)变得至关重要的地方。如果您知道组织中存在的不同限界上下文以及这些限界上下文中包含的域,则可以以正确的方式定义主题名称。很像命名微服务或 REST 服务的资源命名。

2. 考虑版本控制和向后兼容性
一旦开始使用特定模式生成事件,您就定义了契约。其他微服务可以随时随地开始使用这些事件。例如,消费者可以创建一个流并将事件与其域中的数据连接起来。

作为事件的制作者,您需要确保发送出所有可能有用的信息。然而,应用程序不断发展,数据不断添加,有时业务流程也会发生变化。

根据我们的经验,大多数有效负载模式的更新都是向后兼容的。使用 Apache Avro 的“前向传递”兼容模式,可以添加一个字段,您可以在使用旧事件时简单地为其定义一个默认值。

但是当更改不向后兼容时会发生什么?

首先,您不能在同一主题上产生具有相同事件名称的冲突事件。只有当使用应用程序同时部署其代码时,这才有效,这违背了松散耦合和微服务的所有原则。此外,您还将失去重播事件以及流媒体功能的可能性。

不过,您可以为此创建一个新事件。

但更好的是,您可以确保消费者有足够的时间迁移到新的活动结构,并就逐步淘汰旧版本的日期达成一致。我们发现以下过程效果很好:

  • 首先,将特定主题的所有事件迁移到新主题。
  • 然后,您开始生成关于新主题的新事件(以及其他事件类型)。
  • 现在,您创建一个从新主题读取并在旧主题上生成的流。
  • 当所有消费者都迁移到新主题时,您可以轻松地逐步淘汰流并删除旧主题。

3. 对于特定用例,同步 API 仍然有用
在您的组织中,可能对事件驱动架构中的特定集成存在一些困惑。如果我们需要发出需要响应的命令怎么办?为什么我们不能使用 REST 等同步 API?

这是您可以介绍的 2 条指南。对于这些用例,不会丢失事件数据,在实施 EDA 时应避免这种情况:

  • 您可以在特定的有界上下文中使用 REST,只要您还发送必要的业务事件。特别是对于前后端集成,经常使用REST。
  • 您可以考虑对负载不高、需要立即响应且客户端已实现断路器的命令使用 REST POST。然而,这样做时,客户需要有一个备用方案,以防失败。在某些情况下,这仍然可能比发送异步命令更容易。
  • 您还希望 REST 命令后跟一个事件。该事件将表达命令被处理后发生的情况。此事件是您想要保留在事件中心的事件,而不是命令本身。

4. 创建标头和有效负载标准
您的事件由标头和有效负载组成。如果从一开始就对这些进行标准化,则可以更轻松地为不同目的使用事件。

标头可用于指示事件类型、相关 ID 等等。其中一些也是由 Spring 等库设置的。例如命令的相关 ID 和回复主题。

您甚至可以使用这些标头添加重要的元数据,例如域实体 ID。特别是对于普通消费者来说,这开辟了很多机会。在不知道有效负载结构的情况下,他们仍然可以索引这些字段。这使得Cymo Event Explorer等工具非常强大。

如果您同意默认值并正确记录它们,您以后的生活将会变得更加轻松。

这同样适用于有效负载。例如,您可以使用https://github.com/cloudevents/spec引入描述事件中有效负载的常用方法。


5. 引入监控,也适用于商务人士
用商业语言表达您的事件很重要。不仅可以让开发人员确保事件在代码中得到正确解释,还可以进行分析和监控。业务事件表达了不同流程中发生的事情。组织中的每个人都应该能够理解他们所表达的内容。

业务事件探索经常与传统的跟踪解决方案相混淆。

追踪对于找出特定事件发生的情况非常重要。它是什么时候产生的,什么时候消耗的等等。这些数据通常可用一周左右,并通过代码中的拦截器添加。 OpenTelemetry 已成为添加此跟踪信息的良好标准。有许多工具可用于可视化此类跟踪。

商业事件探索更进一步。它不仅用于支持,还可供技术和业务用户用来轻松查找和显示时间轴上的相关业务事件。它还包括特定数据的安全性。通过对数据建立索引并使其长期可用,这成为可能。只要企业想要深入了解这些数据,这可能需要数年时间。根据我们的经验,这项服务很快就变得非常受欢迎。它可以帮助人们理解什么是捕获行为,而不仅仅是处理状态。