我正在使用推荐的 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
}
);
取消令牌
SDK 中的所有异步操作都有一个可选的 CancellationToken 参数。此 CancellationToken 参数在整个操作、所有网络请求和重试中使用。在网络请求之间,可能会检查取消令牌,如果相关令牌过期,则可能会取消操作。取消令牌应用于定义操作范围的近似预期超时。
听起来您正在寻找的是 CancellationToken。
但请注意,为了获得理想的行为,CancellationToken 应高于任何配置的超时(来自同一文档):
...CancellationToken 中配置的时间,请确保它大于您的 RequestTimeout 和 CosmosClientOptions.OpenTcpConnectionTimeout(如果您使用的是 Direct 模式)。
例如,如果您的 CancellationToken 为 5 秒,则 RequestTimeout 和 OpenTcpConnectionTimeout(如果使用 Direct 模式)应该更低。
另请记住,Cosmos DB 中的操作最多可能需要 5 秒才能执行。 5 秒的端到端超时(取决于工作负载)可能不正确(如果您正在进行点操作,可能没问题,但查询可能需要更长时间)。