读取Azure表上的重试
本文关键字:重试 Azure 读取 | 更新日期: 2023-09-27 18:28:47
从Azure表存储读取时,我经常收到错误No connection could be made because the target machine actively refused it
,有时在80(http)上,有时在443(https)上
我知道我可以通过.SaveChangesWithRetries()
设置写入重试,但如何在读取时应用重试?
顺便说一句,我通过代码阅读
DataServiceQuery<datatype> query = tableContext.CreateQuery<datatype>("table");
IQueryable<datatype> results= from q in query select q
上一次我不得不使用半官方的瞬态故障处理框架,但这是一年多前的事了;最佳实践指南可能已经改变。
编辑
正如评论中所指出的,该解决方案已经发展成为瞬态故障处理应用程序块,现在可以作为NuGet包使用。
对于新手来说,该框架基本上为一类传输类型错误指定了重试(hammer)策略,这些错误在任何分布式环境中都会自然发生,尤其是在Azure中。例如,SQL azure可能会返回错误代码"服务器太忙,请稍后再试"或"您的数据在到达这里的路上丢失了,哎呀",您不需要知道所有这些代码就可以基本上说"重试"。
使用Polly:https://github.com/App-vNext/Polly要实现一个重试处理程序,它会截获您希望处理并重试的错误类型/code/etc。对于某些服务,MS自己推荐Polly(请参阅:https://learn.microsoft.com/en-us/azure/architecture/best-practices/retry-service-specific和https://learn.microsoft.com/en-us/dotnet/standard/microservices-architecture/implement-resilient-applications/implement-http-call-retries-exponential-backoff-polly)..而且我发现它的fuild语法使用起来很愉快。下面是我创建的Polly重试处理程序的一个示例,用于处理来自Azure Storage的StorageException。它实现了指数后退(https://github.com/App-vNext/Polly/wiki/Retry#exponential-退避)策略。
int retries = 0;
int maxRetryAttempts = 5;
var retryStorageExceptionPolicy = Policy
.Handle<StorageException>()
.WaitAndRetry(maxRetryAttempts, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)),
onRetry: (exception, calculatedWaitDuration) =>
{
retries++;
loggingService.LogWarning(exception,
new Dictionary<string, string>
{
{"Message", $"A StorageException occurred when trying to Execute Query With Retry. This exception has been caught and will be retried." },
{"Current Retry Count", retries.ToString() },
{"tableName", table.Name},
{"ExtendedErrorInformation.ErrorCode", (exception as StorageException)?.RequestInformation.ExtendedErrorInformation.ErrorCode },
{"ExtendedErrorInformation.ErrorMessage", (exception as StorageException)?.RequestInformation.ExtendedErrorInformation.ErrorMessage }
});
});
retryStorageExceptionPolicy
.ExecuteAndCapture(() =>
{
// your method accessing Azure Storage here
});
如果你想要一个为Http调用构建瞬态错误代码列表的方法,请告诉我。