1

是否有众所周知的模式来管理 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();
}

此代码只是延迟当前对其的调用,但不会阻止来自其他线程的调用。现在我正在使用 a 实现一些不同的东西Stopwatch,我想知道是否有一个众所周知的模式。注意:一切都使用 SDK。

4

1 回答 1

1

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

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

此外,另一个注意事项是,如果您利用了 Azure 搜索 .NET SDK,则已经集成了重试。布鲁斯,在这里有一些很好的信息:Azure Search RetryPolicy

于 2017-07-05T18:29:27.890 回答