Rabbitmq 处理消息以及长期重试策略

Rabbitmq 处理消息以及长期重试策略,rabbitmq,masstransit,Rabbitmq,Masstransit,向机器翻译专家致意 在我的应用程序中,我有默认的重试策略,每3分钟发送一次消息,总共30分钟。如果有许多失败的消息受此策略影响(超过16条),则不会处理其他消息(即使是成功的消息)。这是一个巨大的问题,因为如果有16条断开的消息,那么整个队列将被阻塞30分钟 我肯定有解决办法,但我还没有找到 我认为您正在寻找断路器模式,这可以应用于masstransit,包括: cfg.ReceiveEndpoint(host, "customer_update_queue", e => { e.

向机器翻译专家致意

在我的应用程序中,我有默认的重试策略,每3分钟发送一次消息,总共30分钟。如果有许多失败的消息受此策略影响(超过16条),则不会处理其他消息(即使是成功的消息)。这是一个巨大的问题,因为如果有16条断开的消息,那么整个队列将被阻塞30分钟


我肯定有解决办法,但我还没有找到

我认为您正在寻找断路器模式,这可以应用于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
});
更多信息可在文档中找到:

解决方案是重新交付,即二级重试

这是你的电话号码

有两种使用方法:

从消费者处显式重新交付,在异常情况下调用:

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));
    }
}
公共异步任务使用(consumercontext)
{
尝试
{
//尝试更新数据库
}
捕获(CustomerNotFoundException异常)
{
//安排在一分钟内归还
重新交付(时间跨度从分钟(1));
}
}
或使用配置和策略(端点配置委托的一部分):

ep.Consumer(c=>c.Message(
x=>x.UseDelayedRedelivery(
p=>
{
p、 句柄(e=>e.Message.Contains(“超时”);
p、 指数(40,时间跨度从秒(10),时间跨度从小时(1),
时间跨度从秒(4)开始;
})));

请记住,您必须已配置以使用此功能。可以使用或/集成的调度功能完成此操作。

谢谢。看来我们必须使用这种方法。不要认为这正是我想要的。据我所知,在达到所需阈值之前,消息将被多次使用,这在我的情况下是不可接受的。
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));
        })));