如何将事件驱动架构应用于此示例?

How can event-driven architecture be applied to this example?

我不确定如何在现实场景中使用事件驱动架构。假设有一个由以下后端服务组成的路线规划平台:

public 网站通常会请求所有这 3 个服务的数据。地图数据服务需要有关数据更改请求的用户角色的信息。 planning-tasks-service 需要有关用户的信息,以及有关地图数据的信息以验证新任务。

现在这些服务只会向彼此发出同步请求以获取所需的数据。将这种基本结构转化为事件驱动架构的最佳方式是什么?是否可以通过使用事件来减少依赖? public 网站将如何获得所需的数据?

您的体系结构中缺少的部分是 API Gateway,它应该是您系统中唯一的入口点,由 public 网站直接使用。

API 网关将扮演编排器的角色,它决定将请求路由到哪些服务,并组装前端所需的最终响应。

出于可扩展性目的,API 网关与各个微服务之间的通信应通过事件总线(或消息队列)异步完成。

但是,创建利用微服务的可扩展事件驱动架构的最重要步骤是正确定义系统的有界上下文并理解每个功能的边界。

可以找到有关此架构的更多详细信息here

Cosmin 是 100% 正确的,因为您需要一些东西来进行编排。

如果您的客户需要来自多个服务的数据,可以采用的一种方法是体验 API 方法。

客户调用体验 API,它执行编排 - 从不同来源提取数据并将其提供回客户端。体验的设计 API 严重且故意偏向于客户的需求。

根据您目前所说的细节,我看不出有什么需要基于事件的架构。客户端和 ExpAPI 之间的通信可以是同步和异步的混合,ExpAPI 到 [Services] 的通信也是如此。

不管它的价值如何,将所有这些都放在 API 网关上并不是一个坏主意,因为它们旨在托管 API,因此提供了理想的控制和可观察性用于管理它们。

根据 OP 评论更新

I was really interested in how an event-driven architecture could reduce dependencies between my microservices, as it is often stated

让组件(或系统)通过事件进行对话有点像控制反转的异步等价物,因为事件消费者与发出事件的事物并不紧​​密耦合。这就是减少依赖性的方式。

你可以做的一件事就是做一个小的副项目,就像学习练习一样——拍下你的代码的快照,然后粗略地转换为基于事件的,然后看看结果如何- 与其说是尝试将您的解决方案事件化,不如说是看看将事件放入现实世界的解决方案中是什么样子。如果你有时间,当然可以。

Event storming is the first thing you need to do to identify domain events(a change in state in your system). For example, 'userCreated', 'userModified', 'locatinCreated', 'routeCreated', 'routeCompleted' etc. Then you can define topics that manage these events. Interested parties can consume these events by subscribing to published events(via topics/channel) and then act accordingly. Implementation of an event-driven architecture is often composed of loosely coupled microservices that communicate asynchronously through a message broker like Apache Kafka. Free EDA book 是了解 EDA 中大部分内容的绝佳资源。

Tutorial: Even-driven-architecture pattern