向MT专家致意。
在我的应用中,我有默认重试策略,每3分钟发送一次30分钟的消息。如果有许多受此策略影响的失败消息(超过16个),则不处理其他消息(甚至是成功的消息)。这是一个很大的问题,因为如果有16个损坏的消息,那么整个队列将被阻止30分钟。
我确定有一个解决方案,但我还没找到。
答案 0 :(得分:3)
解决方案是重新发送,即二级重试。
有两种方法可以使用它:
来自消费者的明确重新传递,称为例外:
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配置为使用此功能。可以使用Quartz或RabbitMQ / 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