feat(routing): 完善平台满载避让与故障轮转

为未配置并发上限的平台增加基于运行和等待任务数的软负载,并按非满载、有效优先级、缓存亲和与负载稳定排序。\n\n平台模型 RPM、TPM 和并发额度竞争失败时只轮转候选,不触发冷却、禁用或降级;用户组额度保持不可绕过。补齐异步冷却排队恢复、满载原因、选择原因与低基数指标。\n\n验证:go test ./...;go vet ./...;PostgreSQL 原子额度、准入队列、Worker 容量回收及故障策略 HTTP acceptance。
This commit is contained in:
2026-08-03 17:42:34 +08:00
parent b125599354
commit 8362d6d27a
15 changed files with 468 additions and 152 deletions
+21 -19
View File
@@ -126,6 +126,8 @@ func attemptMetrics(candidate store.RuntimeModelCandidate, attemptNo int, simula
"currentPriority": candidate.PlatformPriority,
"loadRatio": candidate.LoadRatio,
"loadAvoided": candidate.LoadAvoided,
"fullReasons": candidate.FullReasons,
"selectionReason": candidate.SelectionReason,
"simulated": simulated,
}
if candidate.ResponseProtocol != "" {
@@ -138,25 +140,25 @@ func attemptMetrics(candidate store.RuntimeModelCandidate, attemptNo int, simula
metrics["responseConverted"] = true
}
}
if candidate.LoadLimited {
metrics["loadMetrics"] = map[string]any{
"rpm": map[string]any{
"current": candidate.LoadMetrics.RPMCurrent,
"limit": candidate.LoadMetrics.RPMLimit,
"ratio": candidate.LoadMetrics.RPMRatio,
},
"tpm": map[string]any{
"current": candidate.LoadMetrics.TPMCurrent,
"limit": candidate.LoadMetrics.TPMLimit,
"ratio": candidate.LoadMetrics.TPMRatio,
},
"concurrent": map[string]any{
"current": candidate.LoadMetrics.ConcurrentCurrent,
"limit": candidate.LoadMetrics.ConcurrentLimit,
"ratio": candidate.LoadMetrics.ConcurrentRatio,
},
"queued": candidate.LoadMetrics.QueuedCount,
}
metrics["loadMetrics"] = map[string]any{
"rpm": map[string]any{
"current": candidate.LoadMetrics.RPMCurrent,
"limit": candidate.LoadMetrics.RPMLimit,
"ratio": candidate.LoadMetrics.RPMRatio,
},
"tpm": map[string]any{
"current": candidate.LoadMetrics.TPMCurrent,
"limit": candidate.LoadMetrics.TPMLimit,
"ratio": candidate.LoadMetrics.TPMRatio,
},
"concurrent": map[string]any{
"current": candidate.LoadMetrics.ConcurrentCurrent,
"limit": candidate.LoadMetrics.ConcurrentLimit,
"ratio": candidate.LoadMetrics.ConcurrentRatio,
"softCurrent": candidate.LoadMetrics.SoftCurrent,
"softRatio": candidate.LoadMetrics.SoftRatio,
},
"queued": candidate.LoadMetrics.QueuedCount,
}
if candidate.CacheAffinity.Key != "" {
metrics["cacheAffinityKey"] = candidate.CacheAffinity.Key