azure - 管理 Azure 搜索 503

标签 azure azure-cognitive-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();
}

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

最佳答案

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

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

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

关于azure - 管理 Azure 搜索 503,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44933161/

相关文章:

azure-cognitive-search - 在 azure 搜索中索引字典属性

azure - 使用 Azure 搜索 .NET 检查索引是否存在时出现 NullReferenceException?

azure - 将视频上传到azure媒体服务后如何获取发布网址?

azure - 如何构建代码以将 2 个 Web 应用程序部署到同一个 Azure 应用服务

azure - 为什么该字段不接受词法分析

azure 搜索。如果我有很多面怎么办

c# - Azure 搜索合并索引操作返回异常

大型 BCP 操作后,Azure SQL 数据仓库挂起或不响应简单查询

azure - 如何使用 ADAL.js 并对 Web API 和 Azure AD 启用安全 CORS 调用

Azure 搜索,按部分术语搜索