如何在MassTransit延迟后执行自动重试(a.k.a重试周期,二级重试)

时间:2014-07-01 22:49:01

标签: c# masstransit

我正在建立一个消息队列,消息的消耗可能偶尔会失败一段时间(由于网络停机等),在这种情况下,我想在一段时间后重试

这可以在MSMQ的名称为retry cycles的WCF绑定和名为second-level retries的NServiceBus中使用。 MassTransit中有类似的东西吗?

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

2 个答案:

答案 0 :(得分:3)

我不相信有一种内置的方法可以在MassTransit中处理这个问题。

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

鉴于这种情况,如果存在某种网络停机时间,那么相同的网络停机时间是否会影响队列中的其他消息?因此,事实上,阻止消费者线程实际上并不是问题。没有消息会成功,所以让我们等一下再试一次。

假设您队列中的所有消息都做了同样的事情(例如,它们都生成了一些数据,这些数据被保存到数据库服务器中)。

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

答案 1 :(得分:0)

您可以在UseRetry

的总线级别指定它
MassTransit.Bus.Factory.CreateUsingRabbitMq(cfg =>
{
  // ...
  cfg.UseRetry(retryConfig => retryConfig.Interval(2, TimeSpan.FromMinutes(1)));
  // ...
}