如何以 saga 模式查询另一个微服务

问题描述

我正在开发一个采用 Saga 编排模式和每服务数据库设计的 Spring Boot 微服务应用程序。我知道模式应该是异步的。但是,我有一个用例,我有一个需要从另一个服务查询数据的微服务。

以下是上下文:

我有 2 个服务,OrderCustomerOrder一个 customerId 字段。当客户端(通过 HTTP)请求所有订单时,Order 将需要查询 Customer获取具有该特定 customerNamecustomerId。这将返回该订单的所有订单,并附带客户名称,而不是客户 ID。

考虑的解决方案:

  1. 使用同步通信,REST 或 gRPC 用于从 OrderCustomer查询。易于维护,但有数据丢失的风险。

  2. Customer 中的重复 Order 表。这消除了 Order 之外的通信需要,但需要保持数据同步。

解决方法

解决这个问题的一个很好的模式是事件溯源。 Customer 服务在执行数据操作(例如 customerId 和 customerName 事件)时发送事件/消息,Order 服务侦听这些事件。如有必要,订单服务还可以请求重放事件/消息。这使服务解耦,防止静态相互依赖等。希望这会有所帮助。如果需要,我可以详细说明。