管理Azure搜索503

时间:2017-07-05 18:06:50

标签: azure azure-search azure-search-.net-sdk

是否有一个众所周知的模式来管理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的所有内容。

1 个答案:

答案 0 :(得分:1)

管理503时,最好实施更多的增量退避机制而不是固定的时间延迟。例如,从1秒开始,然后是2秒,然后是4秒,然后是8,等等...这个的关键原因是,如果你要向Azure Search发送大量工作,最好让它赶上而不是不断尝试向其发送更多工作。

顺便说一句,对于其他读这篇文章的人来说,有时你会认为在看到这些503(通常用于大量上传)以提供更多资源时添加分区是一个好主意,事实上,这个因为这是服务配置分区需要做的更多工作,所以可以导致更多的503。如果您确实认为需要更多分区,最好在完成工作之前执行此操作,然后在需要时进行缩小。

另外,另一方面是如果您使用Azure Search .NET SDK,则已经集成了重试。布鲁斯在这里有一些很好的信息:http://localhost/app1/Login