【问题标题】:How to avoid synchronous and use asynchronous effectively?如何避免同步并有效使用异步?
【发布时间】:2020-11-08 18:31:27
【问题描述】:

简介

嘿,我的问题有点难以解释,所以我提前道歉。

问题

我正在尝试为我们的电子商务实现微服务,但当实际逻辑和数据需要由其他 (2-3) 服务确定时,我遇到了如何响应请求的问题。

为了便于理解,我举个例子。

假设用户 A 正在尝试购买产品。点击“结帐”按钮后,这些步骤应该会发生。

流程

Request进来:

  • 电子商务服务:
    1. 检查产品库存是否有足够的数量。
    2. 发布一个指示新订单已创建的事件。 order:created
  • 反欺诈服务:
    1. 接收order:created并检查用户是否欺诈
    2. 发布指示检查成功的事件。 check:succeed
  • 支付服务:
    1. 接收check:succeed 并创建一个指向网关的网址。
    2. 将网关 URL 发送给用户。 ((这就是问题所在))

由于所有这些步骤都是异步的,我该如何响应请求?

可能的解决方案

用户请求结账后,电子商务服务创建订单并立即响应新创建订单的orderId,在客户端,用户必须定期请求并检查订单状态是否为PENDING PAYMENT,为了实现这一点,支付服务需要在订单被系统批准后发布payment:created,然后电子商务服务才能更新订单。

我的解决方案有效,但我对微服务真的很陌生,我想请教像您这样的专家如何以更好的方式实现它。

非常感谢您能读到这里,感谢您的宝贵时间。

【问题讨论】:

    标签: microservices


    【解决方案1】:

    您的流程是一个同步过程。您需要上一步的结果,因此必须逐步进行。

    系统观点:

    这里重要的是:“如何处理步骤?”。这让我想起了 SAGA 设计模式(特别是当您需要回滚处理时),但通常有两种类型(编排和编排)。编排描述了多个服务之间的交互,其中编排代表从一方的角度进行控制。

    为简单起见,您可以实现命令模式或使用 Apache camel 等 EAI(企业应用程序集成)工具根据流程处理端点之间的消息。

    如果您有很多访问者,最好在端点之间使用队列,无论是否使用协调器。

    用户观点:

    当用户点击结帐他们的购物车时。他们不期望有很多步骤或做更多的事情,而不仅仅是等待。因为保持连接打开以进行响应不是一个好主意,也许一个加载器和一个定期的 ajax 调用就足够了,而还有其他解决方案,如推送通知(然后你可以考虑着火并忘记机制)。

    【讨论】:

      【解决方案2】:

      您处理定义的请求的工作流程是完全同步的。每个步骤都依赖于上一步,并且在完成之前无法开始。但是,第二步似乎不需要第一步的数据,因此实际上它们可以并行执行。

      所以,可以做的是同时启动它们:

      • 检查产品库存是否有足够数量。
      • 检查用户是否欺诈

      然后

      • 等待响应,如果两者都正常,则创建一个到网关的 url。并将其发送给用户。

      您可以创建骆驼路线或任何其他实现 EIP 的工具来实现该功能

      【讨论】:

        猜你喜欢
        • 2017-01-05
        • 2021-11-09
        • 1970-01-01
        • 1970-01-01
        • 2014-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-20
        相关资源
        最近更新 更多