在MassTransit中,即使客户端请求超时,消息仍在处理



我正在使用MT和RabbitMQ实现标准的请求/响应场景。客户端是Asp.net核心API,而消费者是windows服务。

作为测试异常情况的一部分,如果我停止消费者并使用请求客户端从API提交请求,由于没有消费者处理,API得到请求超时异常,这很酷。但是消息位于消费者队列中,当我启动消费者时,它会选择消息并处理内容(将消息发送到外部端点),并移动到_skip队列,因为没有请求客户端侦听此消息。

你认为这是正确的行为吗?首先,当api获得请求超时异常时,他将重试,所以处理第一条消息的意义是什么?

我怎么能忽略那些消息的请求客户端已经完成了任何错误的处理?

感谢

您所描述的是非常常见的,我建议您阅读幂等和其他分布式系统故障场景。

在基于消息的系统中,发送命令(在本例中是请求)和通过超时传递结果可能非常容易引起误解。例如,如果您查看ForkJoint,在请求超时的情况下,响应实际上是一个202/Accepted,而不是传递一个错误。

消息在队列中,它将被处理,因此没有理由使控制器失败并向调用者报告错误。因此,使用中间响应。

该示例是MassTransit第3季的一部分,在第3季中,我讨论了一种处理分布式系统中命令最终完成/失败的新习惯用法。这里可能有一些有用的示例来帮助您理解故障场景。

正如doc所说,丢弃跳过的消息,这样它们就不会被移动到_skip队列:

cfg.ReceiveEndpoint("input-queue", ec =>
{
ec.DiscardSkippedMessages();
});

最新更新