负载均衡需明确请求分发逻辑并全程复用同一路由规则,否则导致缓存击穿、状态不一致或404;文件上传须基于稳定哈希(如文件ID)确定节点,禁用DateTime.Now.GetHashCode()等非一致性键;节点动态增减时须用一致性哈希库;Polly Hedging是主请求超时前发备份而非并发选快,需配置TimeoutAsync和合理hedgingDelay;API须幂等;推荐用Attribute+反射扫描自动注册处理器,AOT发布时改用源生成器;所有环节必须共享同一套路由逻辑。
负载均衡不是加个
就自动有的事。C# 里真正可控的请求分发,得靠你明确决定“哪个请求发给哪个后端”,且后续所有读操作(包括 CDN 回源)必须复用同一套路由规则——否则缓存击穿、状态不一致、文件找不到,全来了。
文件上传时就该决定存储节点
上传路径不能靠随机或轮询生成,必须基于稳定哈希(如文件 ID 或用户 ID)算出目标节点。否则同一个文件可能被存到不同机器,后续 GET 请求按哈希找过去却 404。
别用
或
当路由键——它们不保证一致性
推荐用
或简单取模:
,前提是节点数短期稳定
如果节点会动态增减,必须用一致性哈希库(如
实现),否则大量 key 重映射
Polly Hedging 不是并发选快,而是错峰保底
的核心是“主请求卡住前发一个备份”,不是同时扔三个请求再挑最快的。它解决的是单点抖动,不是慢服务整体优化。
C知道
CSDN推出的一款AI技术问答工具
下载
必须前置配置
,否则 hedging 没触发条件
是延迟时间,不是并发间隔——设成
就退化成同步重试,失去错峰意义
包含原始请求,设为
表示最多发 3 次,不是“额外再发 3 次”
API 必须幂等:因为取消只作用于
的
,网络层可能已有请求抵达服务端
用自定义 Attribute 实现请求处理器自动注册
手动维护
容易漏注册、难测试、改起来像在修祖传代码。用 Attribute + 反射扫描才是可维护的起点。
类级
标记处理类,方法级
绑定协议 ID
启动时用
扫描,过滤出带
的类型,再遍历其 public 方法找
别在运行时反复反射——扫描只做一次,结果缓存进
注意:.NET 6+ 默认关闭反射元数据保留,若发布为 AOT,请改用源生成器(Source Generator)替代运行时反射
最常被忽略的一点:策略生效的前提是「所有环节共享同一套路由逻辑」。上传时哈希算出节点 A,CDN 回源时却用 IP 做负载,或者前端自己拼 URL 绕过网关——再好的策略也白搭。
HttpClientDateTime.Now.GetHashCode()Guid.NewGuid()ConsistentHashnodeIndex = Math.Abs(hashCode % nodeCount)KetamaPolly.HedgingAsyncTimeoutAsynchedgingDelayTimeSpan.ZeromaxHedgedAttempts3HttpClient.SendAsyncCancellationTokenDictionary> [HandlerClsCfg][HandlerCfg(101)]Assembly.GetExecutingAssembly().GetTypes()HandlerClsCfgHandlerCfgConcurrentDictionary