跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

C#中负载均衡策略_C#请求分发策略教程【高级】

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

相关文章