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 откажется от сообщения, и оно сразу же появится.
Есть несколько вариантов:
- Клонировать сообщение, установить
ScheduledEnqueueTimeUtc
с задержкой, которую вы хотите, отправьте ее, а затем заполните исходное сообщение. - Отложите ваше сообщение, но тогда вы можете получить его только
SequenceNumber
, В этом случае вы можете создать новое сообщение, которое будет содержать порядковый номер исходного сообщения в качестве полезной нагрузки, запланировать новое сообщение и отправить его. Таким образом, вы будете иметь точный счет доставки в исходном сообщении.
В идеале было бы неплохо оставить сообщение с временным интервалом, но это невозможно с текущим API.