Cosmos SDK 中如何控制超时、重试和重试之间的延迟?

问题描述 投票:0回答:1

我正在使用推荐的 SDK - Microsoft.Azure.Cosmos

我想限制 Cosmos 创建文档所需的时间。所以,举例来说,我希望所有的超时、重试之间的延迟和重试在最坏的情况下在 5 秒内完成。那是所有重试都超时的时候。

我可以使用 Service Bus SDK 来完成此操作,当我调用其他 API 时,我可以将内容包装在 Polly 中并轻松控制这些参数。

我想这样做的原因是因为我的服务的调用者将在设定的时间后超时。届时它将取消该请求。我想配置我的应用程序,以便大多数情况下它会在取消请求之前完成所有重试。显然,我可以传播取消令牌,但这并不像在给定窗口内完成所有工作那么整洁。

Cosmos SDK 中的大多数重试选项都是围绕特定的限制情况进行的。我还意识到一些请求将通过 HTTP 发送,一些请求将通过 TCP 以直接模式发送。

我在 .NET 8 项目的 Program.cs 中使用的代码示例来创建 Cosmos 客户端:

CosmosClient cosmosClient = new(
    connectionString: "<connection-string-goes-here>",
    new CosmosClientOptions
    {
        ApplicationPreferredRegions = new List<string> { Regions.SoutheastAsia }
        // I would expect there to be options here for controlling timeouts and retries
    }
);
c# azure .net-core azure-cosmosdb
1个回答
0
投票

参考:https://learn.microsoft.com/azure/cosmos-db/nosql/troubleshoot-dotnet-sdk-request-timeout?tabs=cpu-new#customize-the-timeout-on-the-azure- cosmos-db-net-sdk

取消令牌

SDK 中的所有异步操作都有一个可选的 CancellationToken 参数。此 CancellationToken 参数在整个操作、所有网络请求和重试中使用。在网络请求之间,可能会检查取消令牌,如果相关令牌过期,则可能会取消操作。取消令牌应用于定义操作范围的近似预期超时。

听起来您正在寻找的是 CancellationToken。

但请注意,为了获得理想的行为,CancellationToken 应高于任何配置的超时(来自同一文档):

...CancellationToken 中配置的时间,请确保它大于您的 RequestTimeout 和 CosmosClientOptions.OpenTcpConnectionTimeout(如果您使用的是 Direct 模式)。

例如,如果您的 CancellationToken 为 5 秒,则 RequestTimeout 和 OpenTcpConnectionTimeout(如果使用 Direct 模式)应该更低。

另请记住,Cosmos DB 中的操作最多可能需要 5 秒才能执行。 5 秒的端到端超时(取决于工作负载)可能不正确(如果您正在进行点操作,可能没问题,但查询可能需要更长时间)。

© www.soinside.com 2019 - 2024. All rights reserved.