如何避免同步并有效地使用异步?
How to avoid synchronous and use asynchronous effectively?
简介
嘿,我的问题有点难以解释,所以我提前道歉。
问题
我正在尝试为我们的电子商务实施微服务,但当实际逻辑和数据需要由其他 (2-3) 服务确定时,我遇到了如何响应请求的问题。
为了方便理解,我举个例子
假设用户 A 正在尝试购买产品。单击“签出”按钮后,应该会执行这些步骤。
流量
Request
进来:
- 电子商务服务:
- 检查产品是否有足够的库存。
- 发布指示已创建新订单的事件。
order:created
- 反欺诈服务:
- 接收
order:created
并检查用户是否欺诈
- 发布指示检查成功的事件。
check:succeed
- 支付服务:
- 接收
check:succeed
并创建 url 到网关。
- 将网关 url 发送给用户。 ((这就是问题所在))
由于所有这些步骤都是异步的,我该如何响应请求?
可能的解决方案
用户请求结账后,电子商务服务创建订单并立即响应新创建订单的orderId,在客户端用户必须定期请求并检查订单状态是否为PENDING PAYMENT
,为了实现这一点,支付服务需要在订单被系统批准后发布payment:created
,然后电子商务服务才能更新订单。
我的解决方案有效,但我对微服务真的很陌生,我想请教像您这样的专家如何以更好的方式实现它。
如果你能读到这里,我真的很感激,谢谢你的时间。
您的流程是同步流程。你需要上一步的结果,所以它必须一步一步来。
系统观点:
这里重要的是:“如何处理步骤?”。这让我想起了 SAGA 设计模式(特别是当你需要回滚处理时),但通常有两种类型(编排和编排)。编排描述了多个服务之间的交互,其中编排表示从一方的角度进行控制。
为简单起见,您可以实现命令模式或使用 Apache camel 等 EAI(企业应用程序集成)工具根据流程处理端点之间的消息。
如果您有很多访问者,无论是否使用编排器,都最好在端点之间使用队列。
用户观点:
当用户点击结帐他们的购物车时。他们不希望采取很多步骤或做更多的事情,而不仅仅是等待。因为保持连接打开以进行响应不是一个好主意,也许加载器和它后面的定期 ajax 调用就足够了,而还有其他解决方案,如推送通知(然后你可以考虑着火并忘记机制)。
您处理定义的请求的工作流是完全同步的。每一步都依赖于前一步,并且在完成之前不能开始。不过第二步好像不需要第一步的数据,所以其实可以并行执行。
所以,可以做的是同时启动它们:
- 检查产品是否有足够的库存。
- 检查用户是否欺诈
然后
- 等待响应,如果两者都正常,则创建一个 url 到网关。并将其发送给用户。
您可以创建骆驼路线或任何其他实现 EIP 的工具来实现功能
简介
嘿,我的问题有点难以解释,所以我提前道歉。
问题
我正在尝试为我们的电子商务实施微服务,但当实际逻辑和数据需要由其他 (2-3) 服务确定时,我遇到了如何响应请求的问题。
为了方便理解,我举个例子
假设用户 A 正在尝试购买产品。单击“签出”按钮后,应该会执行这些步骤。
流量
Request
进来:
- 电子商务服务:
- 检查产品是否有足够的库存。
- 发布指示已创建新订单的事件。
order:created
- 反欺诈服务:
- 接收
order:created
并检查用户是否欺诈 - 发布指示检查成功的事件。
check:succeed
- 接收
- 支付服务:
- 接收
check:succeed
并创建 url 到网关。 - 将网关 url 发送给用户。 ((这就是问题所在))
- 接收
由于所有这些步骤都是异步的,我该如何响应请求?
可能的解决方案
用户请求结账后,电子商务服务创建订单并立即响应新创建订单的orderId,在客户端用户必须定期请求并检查订单状态是否为PENDING PAYMENT
,为了实现这一点,支付服务需要在订单被系统批准后发布payment:created
,然后电子商务服务才能更新订单。
我的解决方案有效,但我对微服务真的很陌生,我想请教像您这样的专家如何以更好的方式实现它。
如果你能读到这里,我真的很感激,谢谢你的时间。
您的流程是同步流程。你需要上一步的结果,所以它必须一步一步来。
系统观点:
这里重要的是:“如何处理步骤?”。这让我想起了 SAGA 设计模式(特别是当你需要回滚处理时),但通常有两种类型(编排和编排)。编排描述了多个服务之间的交互,其中编排表示从一方的角度进行控制。
为简单起见,您可以实现命令模式或使用 Apache camel 等 EAI(企业应用程序集成)工具根据流程处理端点之间的消息。
如果您有很多访问者,无论是否使用编排器,都最好在端点之间使用队列。
用户观点:
当用户点击结帐他们的购物车时。他们不希望采取很多步骤或做更多的事情,而不仅仅是等待。因为保持连接打开以进行响应不是一个好主意,也许加载器和它后面的定期 ajax 调用就足够了,而还有其他解决方案,如推送通知(然后你可以考虑着火并忘记机制)。
您处理定义的请求的工作流是完全同步的。每一步都依赖于前一步,并且在完成之前不能开始。不过第二步好像不需要第一步的数据,所以其实可以并行执行。
所以,可以做的是同时启动它们:
- 检查产品是否有足够的库存。
- 检查用户是否欺诈
然后
- 等待响应,如果两者都正常,则创建一个 url 到网关。并将其发送给用户。
您可以创建骆驼路线或任何其他实现 EIP 的工具来实现功能