当前位置: 首页 > 知识库问答 >
问题:

EDA中基于事件源的微服务通信

澹台奇略
2023-03-14

我一直在读关于微服务和事件来源的文章,以及它是如何将服务从另一个服务中分离出来的。有两个概念我不清楚。首先,如果在微服务体系结构中,每个服务都可以独立开发,我们如何解释服务间的通信依赖?

例如,如果服务A和服务B需要通信,那么A需要将一个事件发送到一个中央总线,而B需要监听该事件并根据该事件采取行动,但这似乎会产生很多依赖关系。现在,如果我正在开发服务B,我需要知道服务A可以生成的所有事件。此外,如果服务A添加了任何新事件,那么服务B也需要更改以处理该新事件。所有这些似乎都造成了一个依赖的噩梦,并且似乎您无法真正地“独立”开发每个服务。

其次,请求/响应类型的场景是如何在API网关或流程管理器级别处理的?如果顶层请求触发了一组级联或相互依赖的事件,在向调用方返回响应之前需要处理这些事件,那么这种场景是否很适合微服务?

共有2个答案

汲灿
2023-03-14

首先,如果在微服务体系结构中,每个服务都可以独立开发,我们如何解释服务间的通信依赖?

消息-通过集中于服务之间交换的消息来打破服务之间的直接耦合,并集中于模式的前后兼容的更改策略(以便旧的服务可以从新的服务中读取消息)。

Greg Young在他的《事件版本控制》一书中写到了这些想法。

如果顶层请求触发了一组级联或相互依赖的事件,在向调用方返回响应之前需要处理这些事件,那么这种场景是否很适合微服务?

实际上,只要您将过时的数据纳入到您的设计中,这是很好的。

从根本上说,对查询的响应需要时间传送到客户端;除非您在数据传输过程中锁定所有Writer,否则系统的“真相”很有可能在数据包传输过程中发生了变化。

因此,您不指定查询描述“现在”的状态,而是指定查询描述过去某个时间的状态。因此,如果您向服务a发送一个查询请求,结果包括来自服务B的数据,那么查询结果将包括a在某个特定时间缓存的B数据副本。

因此A对B的查询是异步的,而对于发送给A的请求是异步的。如果更新的数据及时从B到达,以回答查询,那就太好了--你回答的是一些新鲜的陈旧的数据。

是的,可能会发生这样的情况:C向B写入一个更改,得到一个确认,然后查询a。并返回一个不包括已写入和确认的更改的响应。

所以您在解决方案中加入了这样的内容:没有通用时钟。

对于第一个问题,作为服务B的开发人员,我需要知道服务a可以激发的所有事件,并且如果添加了新的事件,我将有一个持续的依赖关系。

不是所有事件。您需要一种通用格式(如avro或json协议缓冲区),以便事件表示可以反序列化,并且您需要使用者能够识别它所关心的事件,但是使用者不识别的事件可以通过一个默认处理程序。

邴宏大
2023-03-14

事件源不是事件驱动的体系结构。理论上,您可以在不使用事件进行集成的生态系统中拥有一个内部事件源的有界上下文/微服务。您还可以通过事件进行非事件源BC的集成。

事件驱动是异步微服务集成的一种。同步集成也是可能的。我不知道这是否是您在问题中隐含地对比基于事件的集成的原因,但您必须管理的依赖关系在这两种情况下是非常相似的。

所以,我想不出任何依赖的恶梦,至少不会比子系统a依赖于子系统B的情况更糟。

现在,如果我正在开发服务B,我需要知道服务A可以生成的所有事件

不,你只订阅你感兴趣的。

此外,如果服务A添加了任何新事件,那么服务B也需要更改以处理该新事件。

再说一遍,如果你对它不感兴趣的话。

所有这些似乎都造成了一个依赖的噩梦,并且似乎您无法真正地“独立”开发每个服务。

一旦一个服务依赖于另一个服务,您显然无法独立地开发每一个服务。您可能过度理解了通过事件的松散耦合所允许的那种“独立性”。

 类似资料:
  • 在实现基于事件源的微服务时,我们遇到的主要问题之一是聚合响应数据。例如,我们可能有两个实体,如学校和学生。一个微服务可能负责处理学校相关的业务逻辑,而另一个微服务可能处理学生。 现在,如果有人通过RESTendpoint进行查询并询问某个特定的学生,他们可能希望了解学校和学生的详细信息,那么对我来说,唯一已知的方法是以下方法。 > 使用类似于服务链接的东西。一个例子是Api-Gateway在向几个

  • 我已经意识到事件源、CQRS、DDD和微服务有一段时间了,现在我想尝试并开始实施一些东西并尝试一些东西。 我一直在研究CQRS的技术方面,我理解其中的DDD概念。写入端如何处理来自UI的命令并发布其中的事件,以及读取端如何处理事件并在其上创建投影。 我遇到的困难是沟通 所以我想重点关注eventstore(这一个:https://eventstore.com/不那么模棱两可)。这就是我想要使用的,

  • 脚本 我正在使用微服务构建快递服务系统。我不确定一些事情,这是我的场景 预订API-这是客户下订单的地方 付款API-这是我们处理预订付款的地方 通知API-有服务负责在一切完成后发送通知。 系统采用事件驱动架构。当客户下预订订单时,我在预订应用编程接口中提交本地交易并发布事件。支付应用编程接口和通知应用编程接口订阅了各自的事件。一旦完成,支付和通知应用编程接口需要向预订应用编程接口确认。 我的问

  • 根据我的理解,当数据库事务跨越微服务时,我们可以通过使用message-broker(kafka、RabbitMQ等)通过发布事件来解决这个问题,这样订阅者微服务就可以通过监听这些事件来更新他们的数据库。 在异常情况下,我们可以发送故障事件,以便订阅服务器服务更新它们的状态。 我们真的需要事件来源吗?

  • 我正在计划一个使用事件源的微服务模型。为了实现高可伸缩性和高吞吐量处理能力,我将使用Kafka作为微服务的消息代理。 在这一点上,我有问题的实现模型,以能够拥有Kafka主题和分区的好处。我的模型需要满足一些要求: 微服务必须从message broker获取数据(post/patch/put/delete) 数据一致性是强制性的,如果实体A需要实体B的先前存在,则必须只存在实体A的指向实体B的有