如何避免同步并有效地使用异步?

How to avoid synchronous and use asynchronous effectively?

简介

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

问题

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

为了方便理解,我举个例子

假设用户 A 正在尝试购买产品。单击“签出”按钮后,应该会执行这些步骤。

流量

Request进来:

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

可能的解决方案

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

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

如果你能读到这里,我真的很感激,谢谢你的时间。

您的流程是同步流程。你需要上一步的结果,所以它必须一步一步来。

系统观点:

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

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

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

用户观点:

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

您处理定义的请求的工作流是完全同步的。每一步都依赖于前一步,并且在完成之前不能开始。不过第二步好像不需要第一步的数据,所以其实可以并行执行。

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

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

然后

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

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