azureservicebus - MassTransit - 配置 Azure 服务总线消息传递重试

标签 azureservicebus masstransit

我正在尝试将消息发送到 Azure 服务总线队列。我希望 MassTransit 在连接失败时重试递送。

我的消息发送实用程序:

public class MessageSender : IMessageSender
{
    private readonly IServiceBus _serviceBus;
    
    public MessageSender(IServiceBus serviceBus)
    {
        _serviceBus = serviceBus;
    }

    public async Task SendMessageAsync(IMessage message)
    {
        await _serviceBus.Send(message);
    }
}

我在另一个类中设置了 MassTransit 配置,该类被注入(inject)到消息发送器实用程序中。

public class MassTransitAzureServiceBus : IServiceBus
{
    private IBusControl _busControl;

    public MassTransitAzureServiceBus()
    {
        _busControl = Bus.Factory.CreateUsingAzureServiceBus(cfg =>
            {
                cfg.Host(new Uri(serviceBusUri), h => 
                {
                    h.NamedKeyCredential = new AzureNamedKeyCredential("name","key");

                    h.RetryLimit = 8; // this is not being honored
                });
            });
    }
}

然后我发送这样的消息:

public async Task Send<TMessage>(TMessage message) where TMessage : IMessage
{
     var sendEndpoint = await _busControl.GetSendEndpoint(new Uri("queue-uri"));
     await sendEndpoint.Send(message, typeof(TMessage));
}

我故意断开互联网连接或为服务总线提供错误的连接字符串作为交付失败测试。

它重试 4 次,然后抛出错误,忽略我设置的重试限制。

尝试 4 次后重试失败。可以在 ClientOptions.Retry 中调整重试设置。 (不知道这样的主机。(myhost.servicebus.windows.net:443)) (不知道这样的主机。(myhost.servicebus.windows.net:443)) (不知道这样的主机。(myhost.servicebus. windows.net:443)) (不知道这样的主机。(myhost.servicebus.windows.net:443))

我也尝试过以下方法,但不起作用。

_busControl = Bus.Factory.CreateUsingAzureServiceBus(cfg =>
{
    cfg.UseMessageRetry(x =>
    {
        x.Immediate(2); // this is not being honored either
    });

    cfg.Host(new Uri(serviceBusUri), h => 
    {
        h.NamedKeyCredential = new AzureNamedKeyCredential("name","key");
    });
});

有没有办法在不使用 Polly 等服务的情况下重试消息传递?我以前使用 Polly 进行重试,以为可以通过使用 MassTransit 内置的重试机制来摆脱它。

最佳答案

首先,UseMessageRetry 用于消费消息 - 它与发送或发布消息完全无关。

第二,MassTransit will retry该重试配置中显示的任何异常类型呈指数级增长,最多可达 1000 次,包括发布/发送。

第三,你没有启动公共(public)汽车。总线应该在启动时创建并启动。当进程关闭时,总线应该停止。

关于azureservicebus - MassTransit - 配置 Azure 服务总线消息传递重试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74850054/

相关文章:

c# - BrokeredMessage 反序列化带有不需要的字符串

.net - MassTransit - 初始化复杂消息的最佳实践

c# - 如何向特定订阅者重新发送消息?

azure - Azure 事件中心和 Azure 服务总线之间的根本区别?

azure - Azure 服务总线可以提供消息日记功能吗?

azure - 使用 REST API 向 Azure 服务总线队列或主题发送消息

dependency-injection - Serilog Sink with MassTransit - IBus 服务解析导致无限循环

c# - 抽象出 MassTransit 依赖

azure - 与 Azure 服务总线一起使用时获取 MassTransit.RequestTimeoutException

c# - Azure 服务总线作为 Web 作业抛出错误提供的锁无效