微服务消息 - 取消请求

时间:2016-05-25 13:42:52

标签: messaging microservices

我试图了解微服务消息而不是纯REST,并且在解耦和使用RabbitMQ或类似调度程序时看到很多好处。 我不太明白的一件事是如何取消请求。

例如:

请求X由对多个微服务的4个调用组成,但是微服务号3比预期花费更多时间并且整个请求到达超时(例如30秒)。 我想在这种情况下用户会得到一个超时错误。 但是,我们如何取消已经在飞行中的请求?我的意思是,在40秒后,微服务3响应并且流程继续......用户现在已经收到他的请求的错误。

由于

1 个答案:

答案 0 :(得分:0)

  

我试图让我的头脑围绕微服务消息而不是   纯REST

在考虑通过同步和异步方式调用服务之间的差异时,一个关键的误解是调用的性质可以直接转移并且彼此等效。

实际上,这可能是真的。例如,您可以定义一个操作,例如:

HTTP 1.1 /api/Thingys/1234 GET

这相当于

channel.Send(new GetThingyQuery{ ThingyId=1234; });
void HandleResponse(Thingy thingy);

作为消息的交换,从一个服务到另一个服务。

然而,还有另一种思考方式。在上面的示例中,假设服务A需要来自服务B的 Thingy 才能执行某些过程。我们可以通过两种方式实现这一目标:

  1. 服务A调用服务B上的GetMyThingy()操作。
  2. 服务A不会调用GetMyThingy,因为服务A 已经拥有Thingy的副本
  3. 那么服务A如何拥有Thingy?

    服务B已经以Event的形式将其发送到服务A.实际上,服务B不必实际上将服务A明确地发送给服务A.服务B甚至不需要知道服务A,因为服务B published是件事。

    因此,在这种情况下,操作从服务B移动到服务A并变为:

    void HandleThingyEvent(ThingyEvent event);
    

    那么是什么导致事件由服务B发布?嗯,这可能就像添加新东西一样简单,或者对现有东西进行更新。

      

    ...如何取消请求。

    这让我们了解了如何回答您的主要问题,我们现在可以看到“完全不需要请求”。我们通过使用事件和发布来实现这一点,虽然它们可以同步实现,但更适合单向消息传递。