Почему моя политика экспоненциального повтора Event Hub не продолжается вечно? - PullRequest
0 голосов
/ 04 июля 2018

Я ожидаю, что следующий код повторится навсегда , но он последовательно выдает исключение после ~ 40 секунд отключения от сети - это лучшее, что я могу сделать для имитации переходного Интернет-соединения или события Перебои в работе концентратора.

var eventHubClient = EventHubClient.CreateFromConnectionString(…);
eventHubClient.RetryPolicy = new RetryExponential(
    TimeSpan.FromSeconds(5), // minBackoff
    TimeSpan.FromMinutes(2), // maxBackoff
    Int32.MaxValue); // maxRetryCount
…
eventHubClient.SendAsync(…).Wait();

Что здесь происходит?

Я использую пакет WindowsAzure.ServiceBus NuGet версии 4.1.10 в .NET Framework 4.6. Я готов изменить пакет или фреймворк, если необходимо.

1 Ответ

0 голосов
/ 04 июля 2018

Этот ответ на связанный вопрос поставил меня на правильный путь. Оказывается, что, скрытый внутри иерархии классов для EventHubClient, есть ссылка на пакет MessagingFactory пакета служебной шины, который имеет свое собственное время ожидания для каждой операции, которое не отображается через тип EventHubClient 1007 *.

Таким образом, способ настроить клиента с очень длительным тайм-аутом будет выглядеть примерно так:

var builder = new ServiceBusConnectionStringBuilder(connectionString)
{
    OperationTimeout = TimeSpan.FromDays(30), // TimeSpan.MaxValue is not allowed
    TransportType = TransportType.Amqp // This needs to be set; default is NetMessaging
};
var messagingFactory = MessagingFactory.CreateFromConnectionString(builder.ToString());
var eventHubClient = messagingFactory.CreateEventHubClient(entityPath);
eventHubClient.RetryPolicy = new RetryExponential(
    TimeSpan.FromSeconds(5),
    TimeSpan.FromMinutes(2),
    Int32.MaxValue);

При этом, после проверки того, что это работает, я понял, что в моем сценарии действительно важно отправлять телеметрию во время повторных попыток, поэтому я фактически вернулся к политике повторения по умолчанию на EventHubClient и просто обернул вызов SendAsync(…) отдельной политикой повторения, используя библиотеку Полли , которая позволяет мне отправлять телеметрию перед каждой повторной попыткой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...