处理邮件以及长期重试策略

时间:2017-10-26 07:38:29

标签: rabbitmq masstransit

向MT专家致意。

在我的应用中,我有默认重试策略,每3分钟发送一次30分钟的消息。如果有许多受此策略影响的失败消息(超过16个),则不处理其他消息(甚至是成功的消息)。这是一个很大的问题,因为如果有16个损坏的消息,那么整个队列将被阻止30分钟。

我确定有一个解决方案,但我还没找到。

2 个答案:

答案 0 :(得分:3)

解决方案是重新发送,即二级重试。

这是documentation

有两种方法可以使用它:

来自消费者的明确重新传递,称为例外:

public async Task Consume(ConsumeContext<ScheduleNotification> context)
{
    try
    {
        // try to update the database
    }
    catch (CustomerNotFoundException exception)
    {
        // schedule redelivery in one minute
        context.Redeliver(TimeSpan.FromMinutes(1));
    }
}

或使用配置和策略(端点配置委托的一部分):

ep.Consumer<CSomeConsumer>(c => c.Message<SomeMessage>(
    x => x.UseDelayedRedelivery(
        p =>
        {
            p.Handle<SqlException>(e => e.Message.Contains("Timeout"));
            p.Exponential(40, TimeSpan.FromSeconds(10), TimeSpan.FromHours(1),
                TimeSpan.FromSeconds(4));
        })));

请记住,您必须scheduling配置为使用此功能。可以使用QuartzRabbitMQ / AzureSB集成日程安排功能来完成。

答案 1 :(得分:0)

我认为您正在寻找断路器模式,这可以应用于masstransit,具有以下内容:

cfg.ReceiveEndpoint(host, "customer_update_queue", e =>
{
    e.UseCircuitBreaker(cb =>
    {
        cb.TrackingPeriod = TimeSpan.FromMinutes(1);
        cb.TripThreshold = 15;
        cb.ActiveThreshold = 10;
        cb.ResetInterval = TimeSpan.FromMinutes(5);
    });
    // other configuration
});

可以在文档中找到更多信息: http://masstransit-project.com/MassTransit/advanced/middleware/circuit-breaker.html