我正在建立一个消息队列,消息的消耗可能偶尔会失败一段时间(由于网络停机等),在这种情况下,我想在一段时间后重试
这可以在MSMQ的名称为retry cycles的WCF绑定和名为second-level retries的NServiceBus中使用。 MassTransit中有类似的东西吗?
我还没能在MassTransit文档中找到答案。我在论坛上找到的最接近答案的是this thread,这表明答案是否定的,但提供了一些解决方法,主要涉及在一段时间内阻止消费线程。我宁愿有一个更像我上面引用的两个实现继续处理其他消息,直到重试延迟过去。
答案 0 :(得分:3)
我不相信有一种内置的方法可以在MassTransit中处理这个问题。
让我们考虑一下你想要重试的动机。你提到网络停机时间。这很有意义,并且是在再次重试消息之前注入某种延迟的一个很好的理由。
鉴于这种情况,如果存在某种网络停机时间,那么相同的网络停机时间是否会影响队列中的其他消息?因此,事实上,阻止消费者线程实际上并不是问题。没有消息会成功,所以让我们等一下再试一次。
假设您队列中的所有消息都做了同样的事情(例如,它们都生成了一些数据,这些数据被保存到数据库服务器中)。
但是,如果队列中有许多不同的消息类型,那么我绝对可以理解为什么您不希望阻止处理这些其他消息。也许现在是观察消费者体系结构的好时机,看看是否将它们分成多个专门构建的队列是有意义的。
答案 1 :(得分:0)
您可以在UseRetry:
的总线级别指定它MassTransit.Bus.Factory.CreateUsingRabbitMq(cfg =>
{
// ...
cfg.UseRetry(retryConfig => retryConfig.Interval(2, TimeSpan.FromMinutes(1)));
// ...
}