我正在从 REST 服务读取,需要处理"等待并重试"以处理一个频繁使用的服务,这会给我一个错误:
每秒查询次数过多
或
服务器繁忙
一般来说,由于我有许多 REST 服务要调用,因此我通常如何处理发生异常时会发生的退避逻辑?
有没有内置的框架? 我只是想编写干净的代码,不太担心管道和基础设施。
您可以将尝试包装在为您处理重试逻辑的方法中。 例如,如果您使用的是 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);
尝试确定一次可以活动多少个活动请求并使用Semaphore
。
这是一种处理资源锁定的方法,其中有多个相同的资源,但数量有限。
下面是有关信号量的 MSDN 文档
我建议您查看企业库中的暂时性故障处理应用程序块。
过去,EL被IMO过度设计并且没有那么有用,但他们已经采取措施解决这个问题; TFHAB是遵循更好设计指南(再次,IMO)的新块之一。