【问题标题】:How to query another microservice in saga pattern如何以 saga 模式查询另一个微服务
【发布时间】:2021-04-23 07:47:12
【问题描述】:

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

以下是上下文:

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

考虑的解决方案:

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

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

【问题讨论】:

    标签: spring-boot microservices saga


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复!是的,我已经对其进行了研究,似乎这是一个很好的模式。但是,实施它是另一回事。您对实施有什么建议吗?
    • 用例需求和使用的产品肯定是有关系的。例如,如果您使用具有变更数据捕获功能的数据库,您可以使用它订阅特定数据变更的通知。同样,您可以使用发件箱模式,其中数据库的数据/tx 日志作为事件尾随/流式传输(例如,使用 kafka)。这些将要求您拥有幂等的 MS 来处理重复消息和/或消息丢失、重播等等。Oracle db 有一个很好的解决方案,因为它内置了 AQ 消息引擎,因此数据+事件操作是原子的,保证准确的一次交付等。
    猜你喜欢
    • 1970-01-01
    • 2022-10-12
    • 1970-01-01
    • 2019-11-23
    • 2018-08-05
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 2018-03-23
    相关资源
    最近更新 更多