Solidway v0.1.0 已以 AGPL-3.0 发布,源码与 Releases 在 GitHub 上。文档正在按发布版本重写:除「快速开始」与「参考」外,其余页面仍在描述计划中的行为。当前权威说明见仓库内的 docs/getting-started.md 与 docs/architecture.md。
选号与换号
一个请求如何选中凭据,失败之后又发生什么。
没有需要配置的「回退链」。一条路由是一个凭据池,网关为每个请求挑一条;如果这次失败说明凭据本身有问题, 就再挑下一条重试——仍然发生在首字节之前。
单个请求的流程
1. 粘性命中? → 先试那条凭据(前提是健康)
2. 选号 → 按策略 + 评分给池子排序
3. 尝试 → 转发,受连接 / 首字节超时约束
4. 失败分类 → 可标记? → 换下一个候选
不可标记? → 原样返回上游响应
5. 没有候选了 → 返回最后一次上游错误
每个候选在单个请求内最多尝试一次;已经试过的凭据即使再被选中也会跳过。
什么情况会「换下一个」
只有说明凭据本身有问题的失败才会继续换:
| 上游结果 | 处置 |
|---|---|
401 |
凭据退役,换下一个候选 |
403 |
凭据冷却,换下一个候选 |
429 |
冷却(区分配额与限流),换下一个候选 |
5xx |
冷却,换下一个候选 |
| 网络错误 / 连接超时 / 首字节超时 | 冷却,换下一个候选 |
其他 4xx |
不标记,响应直接返回客户端 |
每种标记的细节见健康标记。
超时
| 超时 | 作用范围 | 在哪里配置 |
|---|---|---|
| 连接 | 建立到上游的连接 | 系统 → 网络 |
| 首字节 | 等待响应头 | 系统 → 网络 |
| Body / 流 | 流打开后读取单个分块 | 内部预算 |
慢的一次尝试不会吃掉其他候选的预算;下一个候选重新拥有自己的连接与首字节超时。
全部失败时
客户端收到的是最后一次上游失败(状态码与原样响应体);如果连一次尝试都发不出去——例如路由里所有凭据
都已退役或在冷却——则返回网关错误,错误码为 route_exhausted。响应体里没有「逐次尝试清单」这种信封;
单请求的轨迹在用量明细与故障记录里。
会话粘性
如果 (路由, 模型, 会话标识) 有未过期的粘性映射,那条凭据会被优先尝试。健康优先于粘性:冷却或已退役的
凭据会被跳过。