简介
嘿,我的问题很难解释,所以我提前道歉。
问题
我试图为我们的电子商务实现微服务,当实际的逻辑和数据需要由其他( 2-3 )服务来确定时,我遇到了如何响应请求的问题。
为了使它更容易理解,我将举一个例子。
假设用户A正在尝试购买一种产品。单击“签出”按钮后,这些步骤应该会发生。
流
Request进来了:
inventory.
order:creatednot
order:created并检查用户是否是欺诈行为,或者是表示检查成功的事件。check:succeedgateway.
check:succeed并为用户创建一个到check:succeed的url网关url。(这就是问题产生的地方,))由于所有这些步骤都是异步的,我如何响应请求?
可能解决办法
当用户请求结帐后,电子商务服务创建一个订单,并立即使用新创建的订单的orderId进行响应,在客户端,用户必须定期请求并检查订单状态是否为PENDING PAYMENT,为此,支付服务需要在系统批准订单后发布payment:created,然后电子商务服务才能更新订单。
我的解决方案很管用,但我对微服务非常陌生,我想问一下像你这样的专家如何更好地实现这一点。
如果你能读到这么多,我真的很感激,谢谢你抽出时间。
发布于 2020-11-19 07:42:00
您的流程是一个同步过程。你需要一个前一步的结果,所以它必须一步一步地走。
的系统观点:
这里最重要的是:“如何处理台阶?”这让我想起了SAGA的设计模式(特别是当您需要回滚处理时),但是通常有两种类型(编排和编排)。编排描述了多个服务之间的交互,其中编排从一方的角度表示控制。
为了简单起见,您可以实现命令模式或使用EAI()工具(如Apache )根据流程处理端点之间的消息。
如果您有很多访问者,那么最好在端点之间使用队列,无论是使用orchestrator or。
用户视图:
当用户单击以签出他们的购物车时。他们并不期待很多步骤,也不会做更多的事情,而不仅仅是等待。由于保持连接打开以供响应并不是一个好主意,可能是一个加载程序,并且后面有一个定期的ajax调用,所以在有其他解决方案(比如推送通知)(然后可以考虑触发和忘记机制)的情况下,已经足够了。
发布于 2020-11-20 08:33:11
您定义的处理请求的工作流是完全同步的。每个步骤取决于前一步,在完成之前不能开始。然而,第二步似乎不需要来自第一步的数据,因此实际上它们可以并行执行。
因此,我们可以做的是启动这两种方法:
inventory.
然后
您可以创建骆驼路由或实现EIP的任何其他工具来实现此功能。
https://stackoverflow.com/questions/64741697
复制相似问题