我正在从 REST 服务中读取数据,并且需要为使用频繁的服务处理“等待并重试”,这会给我一个错误:
每秒查询次数过多
或者
服务器繁忙
一般来说,由于我有许多 REST 服务要调用,我一般如何处理发生异常时会发生的退避逻辑?
有没有内置这个的框架?我只是想编写干净的代码,而不是太担心管道和基础设施。
我正在从 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);
我建议您查看瞬态故障处理应用程序块,它是企业库的一部分。
过去,IMO 对 EL 进行了过度设计,没有那么有用,但他们已采取措施解决这个问题;TFHAB 是遵循更好的设计指南(同样,IMO)的较新模块之一。