我试图了解微服务消息而不是纯REST,并且在解耦和使用RabbitMQ或类似调度程序时看到很多好处。 我不太明白的一件事是如何取消请求。
例如:
请求X由对多个微服务的4个调用组成,但是微服务号3比预期花费更多时间并且整个请求到达超时(例如30秒)。 我想在这种情况下用户会得到一个超时错误。 但是,我们如何取消已经在飞行中的请求?我的意思是,在40秒后,微服务3响应并且流程继续......用户现在已经收到他的请求的错误。
由于
答案 0 :(得分:0)
我试图让我的头脑围绕微服务消息而不是 纯REST
在考虑通过同步和异步方式调用服务之间的差异时,一个关键的误解是调用的性质可以直接转移并且彼此等效。
实际上,这可能是真的。例如,您可以定义一个操作,例如:
HTTP 1.1 /api/Thingys/1234 GET
这相当于
channel.Send(new GetThingyQuery{ ThingyId=1234; });
void HandleResponse(Thingy thingy);
作为消息的交换,从一个服务到另一个服务。
然而,还有另一种思考方式。在上面的示例中,假设服务A需要来自服务B的 Thingy 才能执行某些过程。我们可以通过两种方式实现这一目标:
那么服务A如何拥有Thingy?
服务B已经以Event的形式将其发送到服务A.实际上,服务B不必实际上将服务A明确地发送给服务A.服务B甚至不需要知道服务A,因为服务B published是件事。
因此,在这种情况下,操作从服务B移动到服务A并变为:
void HandleThingyEvent(ThingyEvent event);
那么是什么导致事件由服务B发布?嗯,这可能就像添加新东西一样简单,或者对现有东西进行更新。
...如何取消请求。
这让我们了解了如何回答您的主要问题,我们现在可以看到“完全不需要请求”。我们通过使用事件和发布来实现这一点,虽然它们可以同步实现,但更适合单向消息传递。