问题描述
我正在开发一个采用 Saga 编排模式和每服务数据库设计的 Spring Boot 微服务应用程序。我知道模式应该是异步的。但是,我有一个用例,我有一个需要从另一个服务查询数据的微服务。
以下是上下文:
我有 2 个服务,Order
和 Customer
。 Order
有一个 customerId
字段。当客户端(通过 HTTP)请求所有订单时,Order
将需要查询 Customer
以获取具有该特定 customerName
的 customerId
。这将返回该订单的所有订单,并附带客户名称,而不是客户 ID。
考虑的解决方案:
-
使用同步通信,REST 或 gRPC 用于从
Order
到Customer
的查询。易于维护,但有数据丢失的风险。 -
Customer
中的重复Order
表。这消除了Order
之外的通信需要,但需要保持数据同步。
解决方法
解决这个问题的一个很好的模式是事件溯源。 Customer 服务在执行数据操作(例如 customerId 和 customerName 事件)时发送事件/消息,Order 服务侦听这些事件。如有必要,订单服务还可以请求重放事件/消息。这使服务解耦,防止静态相互依赖等。希望这会有所帮助。如果需要,我可以详细说明。