【问题标题】:How to configure multiple retry policies in MassTransit如何在 MassTransit 中配置多个重试策略
【发布时间】:2019-03-14 09:57:47
【问题描述】:

我想要针对特定​​消费者的两个单独的重试策略。一个用于HttpRequestException 和SocketException,另一个用于自定义DatabaseException 和未处理的SqlException。我想这样做是因为我希望两者都有单独的指数重试间隔。

我有以下配置:

cfg.ReceiveEndpoint(
    host,
    "ExampleQueueName",
    ec =>
    {
        ec.Consumer<ExampleConsumer>(context);
        ec.EnablePriority(5);
        ec.UseRetry(retryConfig =>
        {
            // exponential backup in minutes
            retryConfig.Intervals(new[] { 1, 2, 4, 8, 16, 32 }.Select(t => TimeSpan.FromSeconds(t)).ToArray());
            retryConfig.Handle<HttpRequestException>(x => x.IsTransient());
            retryConfig.Handle<SocketException>(x => x.IsTransient());
        });
        ec.UseRetry(retryConfig =>
        {
            // exponential backup in seconds
            retryConfig.Intervals(new[] { 1, 2, 4, 8, 16, 32 }.Select(t => TimeSpan.FromSeconds(t)).ToArray());
            retryConfig.Handle<DatabaseException>(x => x.IsTransient());
            retryConfig.Handle<SqlException>(x => x.IsTransient());
        });
    });

目前,只使用第二个。第一个似乎被覆盖了。

我也尝试过像这样配置二级重试:

cfg.ReceiveEndpoint(
    host,
    "QueueName",
    ec =>
    {
        ec.Consumer<ExampleConsumer>(context, factory =>
        {
            factory.UseRetry(retryConfig =>
            {
                // exponential backup in seconds for sql and concurrency exceptions
                retryConfig.Intervals(new[] { 1, 2, 4, 8, 16, 32 }.Select(t => TimeSpan.FromSeconds(t)).ToArray());
                retryConfig.Handle<DatabaseException>(x => x.IsTransient());
                retryConfig.Handle<SqlException>(x => x.IsTransient());
            });
        });
        ec.EnablePriority(5);
        ec.UseRetry(retryConfig =>
        {
            // exponential backup in minutes for http request exceptions
            retryConfig.Intervals(new[] { 1, 2, 4, 8, 16, 32 }.Select(t => TimeSpan.FromSeconds(t)).ToArray());
            retryConfig.Handle<DatabaseException>(x => x.IsTransient());
            retryConfig.Handle<SqlException>(x => x.IsTransient());
        });
    });

但这似乎也不起作用。有谁知道我如何为不同的异常类型应用不同的重试间隔?

【问题讨论】:

    标签: rabbitmq masstransit


    【解决方案1】:

    MassTransit 将所有内容构建为管道,过滤器的顺序很重要。重写上面的示例应该可以解决问题(我所做的只是将消费者移到最后)。

    cfg.ReceiveEndpoint("ExampleQueueName", ec =>
    {
        ec.EnablePriority(5);
        ec.UseMessageRetry(r =>
        {
            r.Intervals(new[] { 1, 2, 4, 8, 16, 32 }.Select(t => TimeSpan.FromSeconds(t)).ToArray());
            r.Handle<HttpRequestException>(x => x.IsTransient());
            r.Handle<SocketException>(x => x.IsTransient());
        });
        ec.UseMessageRetry(r =>
        {
            r.Intervals(new[] { 1, 2, 4, 8, 16, 32 }.Select(t => TimeSpan.FromSeconds(t)).ToArray());
            r.Handle<DatabaseException>(x => x.IsTransient());
            r.Handle<SqlException>(x => x.IsTransient());
        });
        ec.Consumer<ExampleConsumer>(context);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      • 2013-08-18
      • 2017-10-13
      • 2012-08-06
      • 2017-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多