【问题标题】:Azure Service Bus Retry Policy doesn't change the behaviorAzure 服务总线重试策略不会改变行为
【发布时间】:2017-05-08 12:09:42
【问题描述】:

我正在尝试了解 Azure 服务总线上的重试策略,但它没有按我预期的方式工作。我有以下代码,它既监听消息又将消息发送到特定的 azure 队列。

using System;
using Microsoft.ServiceBus;
using Microsoft.ServiceBus.Messaging;

namespace ServiceBusTester
{
    class Program
    {
        static void Main(string[] args)
        {
            var connectionString = "Endpoint=sb://<NamespaceName>.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=<SharedAccessKey>";
            var queueName = "MyTestQueue";

            var retryPolicy = new RetryExponential(TimeSpan.FromSeconds(0), TimeSpan.FromSeconds(30), 15);

            var ns = NamespaceManager.CreateFromConnectionString(connectionString);
            ns.Settings.RetryPolicy = retryPolicy;

            if (!ns.QueueExists(queueName))
                ns.CreateQueue(queueName);

            var mf = MessagingFactory.CreateFromConnectionString(connectionString);
            mf.RetryPolicy = retryPolicy;

            var mr = mf.CreateMessageReceiver(queueName);
            mr.RetryPolicy = retryPolicy;

            var retryCount = 0;

            mr.OnMessage(_ =>
            {
                retryCount++;
                Console.WriteLine($"{retryCount.ToString().PadLeft(4, ' ')} - Message Received: {_.GetBody<string>()}");
                _.Abandon();
            }, new OnMessageOptions() { AutoComplete = true });


            var client = QueueClient.CreateFromConnectionString(connectionString, queueName);
            client.RetryPolicy = retryPolicy;

            var message = new BrokeredMessage("This is a test message!");

            client.Send(message);

            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
    }
}

即使我指定重试策略应该重试 15 次,我仍然看到它只重试默认的 10 次。我什至尝试过使用 NoRetry 策略,但它仍然重试 10 次。

我还验证了队列中的Maximum Delivery Count 被设置为任意大的数字,但这并没有改变任何东西:

我确定我将重试策略分配给众多不同的客户/工厂已经过火了,但我不确定这里出了什么问题。

【问题讨论】:

    标签: c# azure azureservicebus azure-servicebus-queues


    【解决方案1】:

    RetryExponential 旨在供 ASB 客户端在出现暂时性错误时使用,这些错误不会立即冒泡到您的代码中。 IE。客户端内置的内部重试机制,在引发异常之前代表您执行重试。如果没有例外并且你的回调明确放弃消息,这里甚至没有使用重试策略,并且消息只是通过正常传递直到MaxDeliveryCount次(在你的场景中为50次),之后这是DLQed。

    使用重试策略向 ASB 客户端指定在放弃之前如何处理瞬时错误,而不是消息可以出列多少次。

    【讨论】:

    • 好的,感谢您的澄清。在上传到 SO 之前,我在我的应用程序中更改了队列名称,但忘记更改 Max Delivery Count。它现在按您指定的方式工作。
    • 顺便说一句,我在哪里可以找到描述您在回答中所述内容的文档?
    • 这应该提供一些很好的信息:docs.microsoft.com/en-us/azure/…
    • 谢谢 - 我在发帖之前已经阅读了那篇文章 - 但错过了重试仅用于网络/客户端级别重试的事实。
    • 那么,有没有办法让这种重试行为发生在我的侦听器的消息处理程序中发生的瞬时错误?如果我有一个暂时性错误(数据库重新启动、网络打嗝),我想在 1 秒、3 秒等后重试 - 不是立即重试,这就是我放弃消息时发生的情况。我正在使用主题订阅,所以我不能只是将副本放回主题中(会导致其他订阅中的欺骗)。有什么想法吗?
    猜你喜欢
    • 2023-02-07
    • 2014-05-11
    • 1970-01-01
    • 2018-05-07
    • 2017-07-05
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多