跳转至

路由与故障转移

Legate 当前只有一种路由模式:tiered_failover。它先过滤不兼容或不可用的 Endpoint Model,再从最小可用 tier 中按 weight 选择候选,并根据结构化失败分类决定是否继续。

请求路径

Authorization Bearer
  → API Key / Workspace / Model Group authorization
  → inbound Protocol Contract
  → compatible Endpoint Model mappings
  → lowest eligible tier
  → deterministic weighted choice
  → frozen Driver Attempt
  → upstream HTTP
  → success, final error, or failover

候选必须同时满足 Endpoint 状态与调度开启、模型存在、kind 一致、Driver Binding 可用、精确 Contract 覆盖,以及 Endpoint / Mapping breaker 允许尝试。

Tier

Tier 数字越小优先级越高:

  • tier = 0 是主用池;
  • tier = 1 及以后是备选池;
  • 只要较高优先级还有可尝试候选,就不会直接选择较低优先级;
  • 较高优先级全部被排除、breaker open,或尝试产生可重试失败后,才会降级。

Weight

Weight 只在同一个 tier 内表达相对流量份额,必须大于 0。选择器按 Workspace、模型组、kind、invocation 和 tier 维护确定性序列;长期分布接近权重比例,但单个短窗口不保证精确百分比。

一次调用中同一个 Endpoint 最多尝试一次,避免同一故障域因多个模型映射被重复击中。

可故障转移失败

当前默认分类:

情况 作用域 是否继续尝试 原因
HTTP 429 Endpoint rate_limited
HTTP 4085xx Endpoint upstream_unavailable
HTTP 401 / 403 Endpoint endpoint_credentials
HTTP 404 且错误表明模型不存在 Mapping model_unavailable
上游响应超过总限制,或提取后的 Driver JSON skeleton 超过 inline 限制 Mapping response_too_large
网络错误或上游 deadline Endpoint network_error / timeout
调用方取消或 deadline client_canceled / timeout
其他 4xx non_retryable

Driver 可以用协议原生响应和受约束 Outcome 覆盖供应商特殊语义,但不能指示“重试哪个候选”。Core 独占故障转移决策。

所有候选都失败时,原始上游响应超过总限制返回 HTTP 502upstream_response_too_large;图片字段提取后仍无法装入 Driver inline JSON skeleton 时返回 HTTP 502endpoint_driver_response_too_large。两者都不会伪装成 endpoint_driver_unavailablenetwork_error

对于 buffered 响应,Legate 可在响应提交前切换候选。SSE 一旦向调用方提交下游流,就不能透明换到另一个 Endpoint;后续失败记录为 partial failure 或其他终止状态。

熔断器

Breaker 分为两个作用域:

  • Endpoint:网络、认证、限流或上游服务级故障;
  • Mapping:某个 Endpoint 与上游模型组合不可用。

Mapping 失败首次即可打开;Endpoint 的 429401403 首次打开,其他服务故障通常累计 2 次打开。open 后按退避时间拒绝普通请求,恢复窗口只允许原子 half-open probe;成功关闭,失败继续退避。Retry-After 会参与退避,上限 5 分钟。

Redis 配置后多个进程共享 breaker 状态;未配置则各进程独立。配置 generation 变更会重置对应 Workspace 的旧 breaker 状态。

资源容量错误

当前 Endpoint 没有 QPS 或 maxCapacity 字段,也没有基于 Endpoint 的容量租约。capacity_error 表示 Legate 自身有界资源预算不足,例如:

  • 文本并发流或保留内存达到进程 / Workspace 上限;
  • Sidecar 请求重放的内存、spool、文件或 FD 预算不足;
  • 图片 multipart/blob 预算不足;
  • Driver 报告 driver_resource_exhausted

这类错误不会作为上游 Endpoint 故障写入 breaker。

运行统计

每个 Request 记录最终结果;每个 Attempt 记录 routing tier、mapping weight、attempt index、failover reason、breaker state/key、上游与下游状态、Driver 和 Usage。排障时从 origin Request 展开 attempts,避免把内部转发当作第二次业务调用。