使用 MassTransit 设置 UseRetry 间隔

UseRetry set interval with MassTransit

我正在尝试使用带有间隔设置的 UseRetry,使用 MassTransit 和 Azure 服务总线作为传输。 消费者代码:

    public async Task Consume(ConsumeContext<ISimpleRequest> context)
    {
        _log.InfoFormat("Strated working on {0}", context.Message.CustomerId);
        throw new InvalidOperationException("some error");       
    }

请求服务:

var _busControl = Bus.Factory.CreateUsingAzureServiceBus(cfg =>
        {
            var host =  cfg.Host("...", h =>
            {
            });
            cfg.MaxConcurrentCalls = 10;
            cfg.ReceiveEndpoint(host, "requestconsumerbag",
                e => { e.UseRetry(Retry.Interval(2,TimeSpan.FromMinutes(5))); e.Consumer<RequestConsumer>(); });
            cfg.UseServiceBusMessageScheduler();
        });
         _busControl.Start();

消息发送后我希望立即收到一条消息,5 分钟后收到一条消息,10 分钟后收到一条消息。但是我立即收到一条消息,5 分钟后收到两条消息,10 分钟后收到 3 条消息,之后每 5 分钟收到 3 条消息。如果这是错误,我如何编写代码来强制它像我之前说的那样工作?

长重试周期的问题是您超过了 Azure 服务总线的锁定超时。您应该使用消息重新投递而不是重试。

UseRetry() - 是一个内联重试过滤器。它在来自代理的同一次交付中重试相同的消息。它旨在处理瞬态故障,例如 SQL 超时或死锁问题。它不适用于长期重试操作。

现在配置有点棘手,对于 3.4.1,我不确定重试计数是否已集成(可能不是),但对于每种消息类型,您都可以使用计划的重新传送。

x.Consumer<MyConsumer>(cfg =>
{
    cfg.ConfigureMessage<MyMessage>(x => x.UseScheduledRedelivery(r => r.Intervals(1000, 2000))
});

这将使用消息调度程序(在 Azure 中,它将使用 EnqueueMessageTimeUtc 调度消息)。

这在 3.5 中更干净,尚未发布。