6

我正在从 REST 服务中读取数据,并且需要为使用频繁的服务处理“等待并重试”,这会给我一个错误:

每秒查询次数过多

或者

服务器繁忙

一般来说,由于我有许多 REST 服务要调用,我一般如何处理发生异常时会发生的退避逻辑?

有没有内置这个的框架?我只是想编写干净的代码,而不是太担心管道和基础设施。

4

3 回答 3

5

您可以将尝试包装在为您处理重试逻辑的方法中。例如,如果您使用WebClient的异步方法:

public async Task<T> RetryQuery<T>(Func<Task<T>> operation, int numberOfAttempts, int msecsBetweenRetries = 500)
{
     while (numberOfAttempts > 0)
     {
          try
          {
               T value = await operation();
               return value;
          }
          catch
          {
                // Failed case - retry
                --numberOfAttempts;                   
          }

          await Task.Delay(msecsBetweenRetries);
     }

     throw new ApplicationException("Operation failed repeatedly");
}

然后您可以通过以下方式使用它:

// Try 3 times with 500 ms wait times in between
string result = await RetryQuery(async () => webClient.DownloadStringTaskAsync(url), 3);
于 2013-10-15T23:40:20.237 回答
3

我建议您查看瞬态故障处理应用程序块,它是企业库的一部分。

过去,IMO 对 EL 进行了过度设计,没有那么有用,但他们已采取措施解决这个问题;TFHAB 是遵循更好的设计指南(同样,IMO)的较新模块之一。

于 2013-10-16T00:08:26.323 回答
3

尝试确定一次可以激活多少个活动请求并使用Semaphore.

这是一种处理资源锁定的方法,其中有多个相同的资源,但数量有限。

这是关于信号量的 MSDN 文档

于 2013-10-15T22:49:12.657 回答