为什么我的事件中心指数重试策略不会永远持续下去?



我希望以下代码永远重试,但它在与网络断开连接 ~40 秒后始终引发异常 - 这是我模拟暂时性 Internet 连接或事件中心中断所能做的最好的事情。

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

这是怎么回事?

我正在使用WindowsAzure.ServiceBusNuGet 包,版本 4.1.10 在 .NET Framework 4.6 上。如果需要,我愿意更改包或框架。

这个相关问题的答案让我走上了正确的轨道。事实证明,隐藏在EventHubClient类层次结构中,有一个对服务总线包MessagingFactory的引用 - 它有自己的每个操作超时,不会通过EventHubClient类型公开

因此,设置具有很长超时的客户端的方法如下所示:

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的默认重试策略,只是使用 Polly 库使用单独的重试策略包装SendAsync(…)调用,该策略允许我在每次重试之前发送遥测数据。

最新更新