使用 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 中更干净,尚未发布。
我正在尝试使用带有间隔设置的 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 中更干净,尚未发布。