【问题标题】:Need some design pointers on async communication between microservices需要一些关于微服务之间异步通信的设计指针
【发布时间】: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


    【解决方案1】:

    首先,问题描述有点抽象,很难给出具体的建议。

    MicroService1 --> Microservice2 --> Microservice3 之间的通信是异步的

    “异步通信”听起来你可以通过 发布消息进行通信,例如Kafka 主题,消费者 收听该主题。

    现在,客户端需要与 data1 和 data3 交互。

    因此,如果消费者收听topic_for_data3,他们可以“查找”data1 或订阅topic_for_data1,因为在发布data3 时data1 已经可用。

    从抽象的问题描述来看,很难比这更具体。但这可能是一种方法。

    【讨论】:

    • 是的,我所说的异步是指发布事件。为此,我们正在使用 AWS SNS-SQS。
    • 嗨乔纳斯,在问题中添加了上下文。而不是编辑问题,最初点击答案的编辑链接:P
    猜你喜欢
    • 1970-01-01
    • 2018-03-17
    • 2021-06-20
    • 2021-02-23
    • 2017-06-25
    • 2016-06-10
    • 1970-01-01
    • 2021-09-19
    • 2016-03-05
    相关资源
    最近更新 更多