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

如何为Polly速率限制策略添加重试机制?

实现Polly限流+重试策略的正确方式

你不需要用try-catch手动处理重试,Polly本身支持通过**策略组合(Wrap)**来实现重试策略包裹限流策略,自动捕获RateLimitedException并执行重试。以下是具体实现步骤:

1. 定义重试策略

创建一个针对RateLimitedException的异步重试策略,设置最大重试次数为3次,并且可以利用限流策略返回的推荐重试等待时间来精准延迟:

var retryPolicy = Policy
    .Handle<RateLimitedException>()
    .WaitAndRetryAsync(
        retryCount: 3,
        sleepDurationProvider: (retryAttempt, context) =>
        {
            // 从异常中获取限流策略返回的推荐重试间隔
            if (context.TryGetException(out RateLimitedException rateLimitEx))
            {
                return rateLimitEx.RetryAfter;
            }
            // 兜底默认延迟(一般不会走到这里)
            return TimeSpan.FromSeconds(1);
        });

2. 组合限流与重试策略

使用Policy.WrapAsync将重试策略和已有的限流策略组合,重试策略作为外层,限流策略作为内层:

// 你的原有限流策略
var slackApiRateLimitPerChannelPerSecond = 1;
var rateLimit = Policy.RateLimitAsync(
    slackApiRateLimitPerChannelPerSecond, 
    TimeSpan.FromSeconds(slackApiRateLimitPerChannelPerSecond),
    (retryAfter, _) => retryAfter.Add(TimeSpan.FromSeconds(slackApiRateLimitPerChannelPerSecond)));

// 组合策略
var combinedPolicy = Policy.WrapAsync(retryPolicy, rateLimit);

3. 使用组合策略执行请求

之后直接用组合策略包裹你的Slack API调用即可:

await combinedPolicy.ExecuteAsync(async () =>
{
    // 这里调用Slack的postMessage API
    await slackClient.PostMessageAsync(/* 你的API参数 */);
});

说明

  • 当限流策略触发并抛出RateLimitedException时,外层的重试策略会自动捕获该异常,按照配置的重试次数和延迟时间发起重试。
  • 你原有限流策略中调整retryAfter的逻辑会生效,重试策略会使用调整后的等待时间,保证符合Slack的速率限制要求。

内容的提问来源于stack exchange,提问作者sommmen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 09:53:35