如何为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
相关产品推荐
相关产品推荐

