是否有一个众所周知的模式来管理ServiceUnavailable? 我不喜欢这样的事情
catch (CloudException e) when (System.Net.HttpStatusCode.ServiceUnavailable.Equals(e.Response?.StatusCode))
{
var howMuchWait = TimeSpan.FromMinutes(1);
if (e.Response.Headers.TryGetValue("Retry-After", out var hValue))
{
if(RetryConditionHeaderValue.TryParse(hValue.FirstOrDefault(), out var time) && time.Delta.HasValue)
{
howMuchWait = time.Delta.Value;
}
}
logger.LogWarning(() => $"Service Unavailable... Let him rest a bit, I will wait for {howMuchWait}.");
await Task.Delay(howMuchWait);
return indexEntities.Select(x => (string)x[indexKeyFieldName]).ToList();
}
此代码只是延迟当前对它的调用,但不会阻止来自其他线程的调用。
现在我使用Stopwatch
实现不同的东西,我想知道是否有一个众所周知的模式。
注意:使用SDK的所有内容。
答案 0 :(得分:1)
管理503时,最好实施更多的增量退避机制而不是固定的时间延迟。例如,从1秒开始,然后是2秒,然后是4秒,然后是8,等等...这个的关键原因是,如果你要向Azure Search发送大量工作,最好让它赶上而不是不断尝试向其发送更多工作。
顺便说一句,对于其他读这篇文章的人来说,有时你会认为在看到这些503(通常用于大量上传)以提供更多资源时添加分区是一个好主意,事实上,这个因为这是服务配置分区需要做的更多工作,所以可以导致更多的503。如果您确实认为需要更多分区,最好在完成工作之前执行此操作,然后在需要时进行缩小。
另外,另一方面是如果您使用Azure Search .NET SDK,则已经集成了重试。布鲁斯在这里有一些很好的信息:http://localhost/app1/Login