使用Polly实现多请求并发下的授权码刷新策略
2025-05-16 04:49:31作者:昌雅子Ethen
在分布式系统开发中,处理授权令牌过期是一个常见挑战。本文将深入探讨如何在使用Polly库时,优雅地处理并发请求中的授权令牌刷新问题。
问题背景
在现代应用开发中,我们经常需要处理HTTP请求的授权问题。当多个并发请求同时遇到授权令牌过期时,简单的重试机制可能导致多次不必要的令牌刷新操作,这不仅浪费资源,还可能引发竞态条件。
核心挑战
在多请求并发场景下,主要面临两个技术难点:
- 重复刷新问题:当多个请求同时检测到令牌过期时,每个请求都可能触发独立的刷新操作
- 头信息同步:刷新后的新令牌需要及时同步到所有后续请求中
Polly解决方案
Polly作为.NET生态中强大的弹性策略库,提供了完善的机制来处理这类问题。
基础重试策略
我们可以构建一个基础的异步重试策略来处理授权失败:
public static AsyncRetryPolicy<HttpResponseMessage> AuthEnsuringPolicy = Policy<HttpResponseMessage>
.HandleResult(r => r.StatusCode == HttpStatusCode.Unauthorized)
.RetryAsync(1, onRetryAsync: async (ex, i, context) =>
{
// 令牌刷新逻辑
});
并发控制机制
为了防止多个请求同时触发刷新操作,我们引入SemaphoreSlim实现互斥访问:
private static readonly SemaphoreSlim _semaphoreSlim = new(1);
private DateTime? _lastRefreshed;
public async Task<bool> RefreshTokenAsync(HttpClient httpClient)
{
await _semaphoreSlim.WaitAsync();
try
{
if(_lastRefreshed.HasValue && DateTime.UtcNow - _lastRefreshed < TimeSpan.FromSeconds(3))
{
return false; // 短时间内已刷新过
}
// 执行令牌刷新
_lastRefreshed = DateTime.UtcNow;
}
finally
{
_semaphoreSlim.Release();
}
return true;
}
完整策略实现
结合Polly上下文和并发控制,我们可以构建完整的解决方案:
- 策略配置:
var wrapOfRetryAndFallback = Policy.WrapAsync(
Policy.HandleResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode)
.FallbackAsync(fallbackAction, onFallBackAsync),
AuthEnsuringPolicy
);
- HTTP客户端注册:
services.AddHttpClient("NamedClient")
.AddPolicyHandler(wrapOfRetryAndFallback);
- 请求执行:
var context = new Context
{
{ "httpClient", httpClient },
{ "cancellationTokenSource", new CancellationTokenSource() }
};
requestMessage.SetPolicyExecutionContext(context);
最佳实践
- 令牌刷新频率控制:通过时间戳记录避免频繁刷新
- 头信息原子操作:确保头信息的更新是线程安全的
- 合理的重试间隔:采用指数退避策略避免服务器过载
- 上下文传递:利用Polly上下文共享HTTP客户端实例
总结
通过结合Polly的重试策略和.NET的并发控制机制,我们可以优雅地解决多请求并发下的授权令牌刷新问题。这种方案不仅保证了系统的稳定性,还优化了资源利用率,是构建健壮分布式系统的重要模式之一。
在实际应用中,开发者还需要考虑令牌刷新的失败处理、日志记录等周边问题,以构建更加完善的授权管理机制。
登录后查看全文
热门项目推荐
相关项目推荐
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00
GLM-4.7-FlashGLM-4.7-Flash 是一款 30B-A3B MoE 模型。作为 30B 级别中的佼佼者,GLM-4.7-Flash 为追求性能与效率平衡的轻量化部署提供了全新选择。Jinja00
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin07
compass-metrics-modelMetrics model project for the OSS CompassPython00
项目优选
收起
deepin linux kernel
C
27
11
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
522
3.71 K
Ascend Extension for PyTorch
Python
327
384
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
875
576
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
334
161
暂无简介
Dart
762
184
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
1.32 K
744
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
12
1
React Native鸿蒙化仓库
JavaScript
302
349
华为昇腾面向大规模分布式训练的多模态大模型套件,支撑多模态生成、多模态理解。
Python
112
134