在Azure Table上读取重试

时间:2012-03-24 07:32:55

标签: c# azure azure-table-storage

我从Azure表存储中读取时经常收到错误No connection could be made because the target machine actively refused it,有时候在44(https)的某个时间80(http)

我知道我可以设置.SaveChangesWithRetries()的写入重试,但是如何在读取时应用重试?

顺便说一下,我按代码阅读

DataServiceQuery<datatype> query = tableContext.CreateQuery<datatype>("table");
IQueryable<datatype> results= from q in query select q

2 个答案:

答案 0 :(得分:1)

最后我不得不使用半官方Transient Fault Handling Framework,但这是一年多前了;并且最佳实践指南可能已经改变。

修改

正如评论中所指出的,此解决方案已演变为The Transient Fault Handling Application Block,现在可以作为NuGet包使用。

对于没有经验的人来说,框架基本上为在任何分布式环境中自然发生的一类传输类型错误指定了重试(锤子)策略,特别是在Azure中。例如,SQL azure可能会返回错误代码“服务器太忙,请稍后再试”或“您的数据在此处丢失,oops”,并且您不需要知道所有这些代码以便基本上说“重试”。

答案 1 :(得分:0)

使用Polly:https://github.com/App-vNext/Polly实现重试处理程序,该处理程序拦截您希望处理的错误类型/代码/ etc并重试它们。 MS自己推荐Polly用于某些服务(参见:https://docs.microsoft.com/en-us/azure/architecture/best-practices/retry-service-specifichttps://docs.microsoft.com/en-us/dotnet/standard/microservices-architecture/implement-resilient-applications/implement-http-call-retries-exponential-backoff-polly) ..并且我发现它的fuild语法使用起来很愉快。 这是我创建的用于处理Azure存储中的StorageException的Polly重试处理程序的示例。它实现了指数退避(https://github.com/App-vNext/Polly/wiki/Retry#exponential-backoff)策略。

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调用建立一个Transient错误代码列表,请告诉我。