首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何避免微服务间的同步通信

如何避免微服务间的同步通信
EN

Software Engineering用户
提问于 2018-03-30 13:18:17
回答 1查看 1.4K关注 0票数 0

假设我们说的是一家网店。

  1. 微型服务1:管理产品及其价格
  2. 小额服务2:负责付款和结账。

如果用户希望为产品付费,则调用支付服务。服务必须同步返回成功或失败。此外,服务还必须保证使用目前的价格。

因此,当前工作流将productIds传递给支付服务。支付服务查询当前价格(来自服务1 SYNCHRON)。支付服务运行支付过程。

工作流程:

代码语言:javascript
复制
Caller (App) -> Payment service -> Product service -> Payment service -> Caller (App) 

如何将这种场景优化为异步通信?还是通过rest服务进行同步通信是最好的方式?

EN

回答 1

Software Engineering用户

发布于 2018-03-30 14:18:39

没有最好的编程方法。一切都取决于情况。我以为你的解释不太清楚。我假设您想说您的工作流->服务2 ->服务1,现在您想要调用服务1异步。

解决方案:如果这是正确的,那么我认为您不能使用异步,因为您需要等待服务1返回当前价格才能继续。或者你可以改变你的过程:

您可以从工作流调用您的服务1(传递productId并获取当前价格)。获得所有信息后,调用Service 2并传递参数中的所有数据。这样,您就不必担心同步和异步。

代码语言:javascript
复制
    private void YourProcessFlow() //inside your workflow
    {
        var currentPrice = InvokeService1(12345);
        InvokeService2(12345, currentPrice);
    }

Alternative:这里是异步代码,以防万一,如果您想在其他地方使用它:

代码语言:javascript
复制
    using System.Threading.Tasks;

    new Task(() => { InvokeService1(12345);}).Start();

    private int InvokeService1(int productId)
    {
        // Invoke your Service 2 here
        return price;
    }

这里,第1行将调用您的方法,然后转到下一行代码。这将不会等待方法返回值。就像我说的,您需要currentPrice才能继续,而这不能被异步完成。

想法:我不知道你的全部情况,但如果你的服务/工作流还有其他事情要做,而且它们不依赖于彼此的结果,那么你可以使用并行编程的概念。你可以用谷歌搜索更多信息。

票数 4
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/368593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档