Minbackoff политики повторов политики служебной шины Azure не работает?

Я пытаюсь заставить работать логику повторения очереди, и у меня возникла проблема. переменная minBackoff, похоже, на самом деле не работает. Я вижу в своих журналах, что сообщение получено, затем происходит сбой, а затем повторяется почти немедленно. Мой minBackoff установлен на 600 секунд.

Вот код, который устанавливает запрос:

 NamespaceManager nsManager = NamespaceManager.CreateFromConnectionString(connectionString);
        nsManager.Settings.RetryPolicy = new RetryExponential(minBackoff: TimeSpan.FromSeconds(5),
                                                            maxBackoff: TimeSpan.FromSeconds(30),
                                                            maxRetryCount: 3);

        if (!nsManager.QueueExists(queueName))
        {
            nsManager.CreateQueue(queueName);
        }
        else
        {
            nsManager.DeleteQueue(queueName);
            nsManager.CreateQueue(queueName);
        }

        QueueClient client = QueueClient.CreateFromConnectionString(connectionString, queueName);


        client.RetryPolicy = new RetryExponential(minBackoff: TimeSpan.FromSeconds(15),
                                                         maxBackoff: TimeSpan.FromSeconds(600),
                                                         maxRetryCount: 3);
        for (int i = 0; i < 2000; i++)
        {
            UserCreationSubmitted creationMessage = new UserCreationSubmitted()
            {
                CreationStatus = "Step 1",
                Id = Guid.NewGuid(),
                UserName = "user number " + i,
                Userid = Guid.NewGuid()
            };

            BrokeredMessage message = new BrokeredMessage(creationMessage);
            client.Send(message);

        }

Вот код, который не работает так, как мне кажется...

client.RetryPolicy = new RetryExponential(minBackoff: TimeSpan.FromSeconds(15),
                                                         maxBackoff: TimeSpan.FromSeconds(600),
                                                         maxRetryCount: 3);

        client.OnMessage(message =>
        {

            UserCreationSubmitted msg = message.GetBody<UserCreationSubmitted>();
            Console.WriteLine("------------------------------");
            Console.WriteLine($"Body {msg.UserName}");

            Random rnd = new Random();
            int ranNum = rnd.Next(0, 9);
            if (msg.UserName.Contains(ranNum.ToString()))
            {
                Console.WriteLine("!!!Error!!!");
                Console.WriteLine("------------------------------");
                throw new Exception();
            }
        });

У кого-нибудь есть идеи относительно того, почему minbackoff и maxbackoff, кажется, здесь не работают? Как ни странно, maxRetryCount работает как солдат, так что я думаю, что это определенно что-то в моей реализации, что заставляет других не работать.

1 ответ

Решение

RetryExponential используется клиентом ASB для повторных попыток при получении сообщения. В вашем коде исключение выдается во время обработки в обратном вызове API OnMessage после того, как сообщение было получено. API OnMessage откажется от сообщения, и оно сразу же появится.

Есть несколько вариантов:

  1. Клонировать сообщение, установить ScheduledEnqueueTimeUtc с задержкой, которую вы хотите, отправьте ее, а затем заполните исходное сообщение.
  2. Отложите ваше сообщение, но тогда вы можете получить его только SequenceNumber, В этом случае вы можете создать новое сообщение, которое будет содержать порядковый номер исходного сообщения в качестве полезной нагрузки, запланировать новое сообщение и отправить его. Таким образом, вы будете иметь точный счет доставки в исходном сообщении.

В идеале было бы неплохо оставить сообщение с временным интервалом, но это невозможно с текущим API.

Другие вопросы по тегам