You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过CosmosClient统计HTTP 429限流引发的重试次数?

解答:Cosmos Client限流重试次数的记录方法

针对你提出的两个关于Cosmos Client重试次数的问题,我来逐一说明可行的解决方案:

问题1:CosmosClient能否输出因限流(HTTP 429)而发生的重试次数?

当然可以!Cosmos Client本身不会主动打印重试次数,但你可以通过两种核心方式获取这些信息:

  • 启用诊断日志:在CosmosClientOptions中配置日志输出,Cosmos Client会自动记录每个请求的详细诊断信息,包括重试次数、每次重试的等待时间等。你可以将这些日志输出到应用的日志系统(比如Serilog、NLog)或者Azure Monitor中查看。
  • 通过Diagnostics属性或全局回调捕获:每个请求的返回结果(比如ItemResponse<T>)都包含Diagnostics属性,里面存储了该请求的所有重试细节;同时你也可以通过全局回调统一处理所有请求的重试信息。

问题2:如何在批量插入代码中记录重试次数,定位限流最多的操作?

针对你当前的批量插入代码,只需要在任务完成后,从每个ItemResponse的Diagnostics属性中提取重试次数即可。下面是修改后的代码示例:

var batchSize = 200; 
for (int i = 0; i < items.Count() / batchSize + 1; i++) { 
    var insertTasks = new List<Task<ItemResponse<MyType>>>(); 
    var batchItems = items.Skip(i * batchSize).Take(batchSize); 
    if (!batchItems.Any()) break; 
    
    foreach (var batchItem in batchItems) { 
        insertTasks.Add(container.CreateItemAsync(batchItem)); 
    } 
    
    // 等待所有插入任务完成,并获取结果
    var insertResults = await Task.WhenAll(insertTasks); 
    
    // 遍历结果,记录每个Item的重试次数
    foreach (var result in insertResults) {
        int retryCount = result.Diagnostics.TotalRetryAttempts;
        if (retryCount > 0) {
            // 这里可以替换成你的日志记录逻辑,比如写入文件或监控系统
            Console.WriteLine($"Item ID: {result.Resource.Id} 因限流重试了 {retryCount} 次");
        }
    }
}

另外,如果你想全局监控所有Cosmos请求的重试情况,不需要在每个操作里单独处理,可以在CosmosClientOptions中注册OnDiagnostics回调:

CosmosClientOptions options = new CosmosClientOptions { 
    ConnectionMode = ConnectionMode.Direct, 
    AllowBulkExecution = true, 
    MaxRetryAttemptsOnRateLimitedRequests = 30, 
    MaxRetryWaitTimeOnRateLimitedRequests = TimeSpan.FromSeconds(180),
    // 全局诊断回调,捕获所有请求的重试信息
    OnDiagnostics = (diagnostics, context) => {
        int retryCount = diagnostics.TotalRetryAttempts;
        if (retryCount > 0) {
            Console.WriteLine($"请求路径: {context.ResourceUri} 累计重试 {retryCount} 次");
        }
    }
};

补充说明:

  • TotalRetryAttempts属性直接返回该请求因限流(或其他可重试错误)的总重试次数,非常直观。
  • 如果你需要更细粒度的信息(比如每次重试的等待时间、触发重试的错误码),可以查看diagnostics.FailedAttempts集合,里面包含了每一次失败尝试的详细数据。
  • 由于你开启了AllowBulkExecution,批量操作中的每个子请求都会有独立的Diagnostics信息,不会互相干扰。

内容的提问来源于stack exchange,提问作者Mathias Rönnlund

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 10:57:50