【发布时间】:2020-12-27 05:36:31
【问题描述】:
我有一个用例,客户端需要与不同微服务拥有的不同实体进行交互。但这些实体实际上依赖于先前的实体来创建它们。 例如:MicroService1 拥有 data1 微服务2拥有data2(data2创建需要data1) 微服务3拥有data3(data3创建需要data2)
MicroService1 --> Microservice2 --> Microservice3 之间的通信是异步的
现在,客户端需要与 data1 和 data3 交互。这实际上导致了分布式环境中的经典问题,客户端在摄取 data1 后需要与 data3 交互,但 data1 尚未到达 MicroService2,最终 data2 尚未到达 Microservice,因此系统还没有 data3。
对我来说,最后一个手段是使流程同步以处理用例或引入计算等待。但我希望是否有任何设计模式/参考可以让我在处理场景的同时保持服务之间通信的异步特性。
对于上下文,此处的 Data1 是采购订单,data2 是采购订单中的物品及其价格,而 data3 是发票(按确定的频率创建),其中包含来自多个此类采购订单的所有物品。客户将流式传输采购订单并期待他们的发票。因此,可能会发生多种竞争条件。客户希望为特定采购订单开具发票,但仍在处理中。需要在运行发票中加入的采购订单甚至还没有到达微服务3。或者更糟糕的是,采购订单有一个更新的版本 v2,有一些额外的项目,但微服务 2 只处理了 v1 的项目,现在发票创建最终将使用 v1 而不是 v2。这是因为我们在事件级别进行处理,但如果调用是同步的,我们会在创建发票之前收到 v2
【问题讨论】:
标签: architecture microservices system-design