读取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

读取Azure表上的重试

上一次我不得不使用半官方的瞬态故障处理框架,但这是一年多前的事了;最佳实践指南可能已经改变。

编辑

正如评论中所指出的,该解决方案已经发展成为瞬态故障处理应用程序块,现在可以作为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调用构建瞬态错误代码列表的方法,请告诉我。