高并发加载测试中Client调用触发TaskCanceledException且Polly重试策略未执行的问题咨询
高并发加载测试中Client调用触发TaskCanceledException且Polly重试策略未执行的问题咨询
各位大佬好,我最近在做高并发压测的时候碰到了一个棘手的问题,想过来请教下:
我的系统架构
- 核心服务基于C#/.NET 6构建,是个包含多个Azure组件的复杂解决方案:有4个Azure服务触发器,它们都会调用一个运行在Azure HTTP Trigger上的API
- 每个触发器最多跑30个并行会话,每个会话又包含多达10个处理任务,所有任务都会并发调用API来访问资源
- 客户端用的是Flurl的无服务器默认配置,已经启用了HTTP/2;API端在统一域名下的不同路径都配置了Polly重试策略
压测场景与异常表现
- 我用同技术栈写了个控制台应用作为压测工具,会循环调用启动处理的API多达1000次,同时让后端系统保持并发处理这些请求
- 前800次调用基本都正常,但之后不管是控制台压测端还是Azure函数端,都会开始出现超时问题
- 监控显示API的CPU和内存占用一直很低(<30%),虽然套接字的使用量有上升,但还在允许的限制范围内
错误详情
抛出的异常为:
TaskCanceledException - "The operation was canceled."
内部堆栈跟踪如下:at System.Net.Http.Http2Connection.Http2Stream.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token) at System.Net.Http.Http2Connection.Http2Stream.<ReadResponseHeadersAsync>d__74.MoveNext() at System.Net.Http.Http2Connection.<SendAsync>d__111.MoveNext() at System.Net.Http.HttpConnectionPool.<SendWithVersionDetectionAndRetryAsync>d__89.MoveNext() at System.Net.Http.DecompressionHandler.<SendAsync>d__16.MoveNext() at Microsoft.Extensions.Http.PolicyHttpMessageHandler.<SendCoreAsync>d__6.MoveNext() at Polly.Retry.AsyncRetryEngine.<ImplementationAsync>d__0`1.MoveNext() at Polly.AsyncPolicy`1.<ExecuteInternalAsync>d__23.MoveNext() at Microsoft.Extensions.Http.PolicyHttpMessageHandler.<SendAsync>d__5.MoveNext() at System.Net.Http.HttpClient.<<SendAsync>g__Core|83_0>d.MoveNext()
我的观察与疑问
- 我发现这个错误出现时,配置的Polly重试策略完全没有触发,这让我怀疑请求根本没到达服务器,所以问题应该不是API端资源过载导致的
- 我已经给微软提交了工单,但还是想问问,在客户端这边有没有什么排查方向或者可以优化的点?
备注:内容来源于stack exchange,提问作者Jose Luiz Berg
相关产品推荐
相关产品推荐

