如何在传输延迟后进行自动重试(也称为重试周期,第二级重试)

本文关键字:重试 周期 二级 传输延迟 | 更新日期: 2023-09-27 18:11:07

我正在设置一个消息队列,其中消息的消费可能偶尔会失败一段时间(由于,例如,网络停机),在这种情况下,我想在一段时间后重试。

这在MSMQ的WCF绑定中以重试周期命名,在NServiceBus中以二级重试命名。在麻省地铁中也有类似的服务吗?

我还没能找到一个答案,这个在masstrtransit文档。我能在论坛上找到的最接近答案的是在这个线程中,这表明答案是否定的,但提供了一些解决方法,主要涉及阻塞消费线程一段时间。我宁愿有一个更像上面提到的两个实现,继续处理其他消息,直到重试延迟过去。

如何在传输延迟后进行自动重试(也称为重试周期,第二级重试)

我不相信在masstrtransit中有一个内置的方法来处理这个问题。

让我们考虑一下想要重试的动机。您提到了网络停机时间。这很有意义,并且是在再次重试消息之前注入某种延迟的好理由。

然而,在这种情况下,如果存在某种网络停机,那么同样的网络停机将影响队列中的其他消息,这难道不是合理的吗?所以,实际上,阻塞消费者线程并不是一个问题。这些消息都不会成功,所以让我们等一会儿,稍后再试。

这是假设你队列上的所有消息几乎都在做同样的事情(例如,它们都生成一些数据,这些数据被保存到停机的数据库服务器上)。

但是,如果您的队列中有许多不同的消息类型,那么我完全可以理解为什么您不希望阻塞对这些其他消息的处理。也许现在是查看消费者体系结构的好时机,看看将它们划分为多个专门构建的队列是否有意义。

您可以通过usertry在总线级别指定它:

MassTransit.Bus.Factory.CreateUsingRabbitMq(cfg =>
{
  // ...
  cfg.UseRetry(retryConfig => retryConfig.Interval(2, TimeSpan.FromMinutes(1)));
  // ...
}