我正在使用推荐的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
    }
);

推荐答案

参考: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

CancerationToken

SDK中的所有异步操作都有一个可选的CancerancationToken参数.此CancerancationToken参数在整个操作中跨所有网络请求和重试使用.在网络请求之间,可以判断取消令牌,并且如果相关令牌过期,则取消操作.取消令牌应用于定义操作范围的大致预期超时.

听起来您要找的是CancerationToken.

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

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

例如,如果CancerationToken是5秒,则RequestTimeout和OpenTcpConnectionTimeout(如果使用Direct模式)应该更低.

还要记住,在Cosmos DB中的操作可能需要高达5 seconds to execute次.5秒的端到端超时(取决于工作负载)可能不正确(如果您正在进行点操作,可能会很好,但查询可能需要更长的时间).

Csharp相关问答推荐

元素存在方法是否损坏

C#中的包版本控制

如何使用Automapper映射两个嵌套列表

C# uwp中的Win11启动屏幕剪辑工作方式不同

为什么在GuardationRule的收件箱函数中,decode.TryParse(valueString,out valueParsed)在给出1.0.1时返回true?

图形.DrawString奇怪异常的字距调整

AutoMapper -如何为两个不同的用例设置单个映射?

如何使用C#Interop EXCEL创建度量衡

Appsettings.json未加载.Net 8 Blaazor Web程序集

异步任务导致内存泄漏

用于管理System.Text.Json中的多态反序列化的自定义TypeInfoResolver

如何在.NET MAUI中最大化GraphicsView的大小?

{ or ; expected error如何解决此问题

如何在特定环境中运行dotnet测试?

Visual Studio 17.8.0制表符自动完成问题--三缩进

在构造函数中传递C#函数以用作EventHandler委托的订阅服务器

Maui:更改代码中的绑定字符串不会更新UI,除非重新生成字符串(MVVM)

C#中使用ReadOnlySpan的泛型类型推理

Azure队列触发器未使用隔离的工作进程执行

如何在更新数据库实体时忽略特定字段?