86 lines
4.0 KiB
Markdown
86 lines
4.0 KiB
Markdown
# 对话内容提取结果
|
||
|
||
## 权威来源
|
||
|
||
- 文件:`对话内容.md`
|
||
- 大小:167,284 字节
|
||
- 行数:9,404 行
|
||
- 读取时间:2026-07-28
|
||
|
||
## 最终产品边界
|
||
|
||
系统同时提供两种入口:
|
||
|
||
1. Gateway:系统选择上游代理并代转发 HTTP、HTTPS CONNECT,预留
|
||
SOCKS5 扩展。
|
||
2. Distribution API:一次性、独占地返回真实上游代理。代理成功提取后
|
||
立即从可分配池移除,不需要租约、释放接口或使用量追踪。
|
||
|
||
系统管理多个 Upstream Provider,并使用配置化 Routing 决定 Gateway 或
|
||
Extract 请求使用哪些 Upstream。
|
||
|
||
## 后出现并覆盖早期建议的决策
|
||
|
||
- Distribution API 的 Lease/Release/Shared Allocation 方案被最终的
|
||
Exclusive Extraction 取代。
|
||
- `pool.maxSize` 表示当前系统维护的未提取代理硬上限;累计供应商提取额度
|
||
使用独立的 `fetch.maxTotal`,不能复用同一个字段。
|
||
- `switchAfterEmptyFetch` 只统计“上游请求成功、解析成功,但解析后没有任何
|
||
合法代理”的结果;超时、HTTP 错误、认证错误、DNS 错误和模板错误只计
|
||
`fetchErrorCount`。全重复结果不当作空结果,单独记录。
|
||
- `consecutiveEmptyFetch` 属于 Upstream;Sequential 当前选择属于 Routing。
|
||
某 Upstream 达到阈值时,引用它的 Routing 原子切换;已有代理继续耗尽。
|
||
- Extract API 默认部分满足 `partial`;也支持 `allOrNothing`。
|
||
- Extract API 从 `AVAILABLE` 原子转换到 `EXTRACTED` 后才返回,保证同一代理
|
||
永不发放两次。
|
||
|
||
## 核心不变量
|
||
|
||
- 请求热路径不得调用 Provider API,也不得查询全量 Redis/PostgreSQL 后排序。
|
||
- 代理分配必须原子预留容量,防止并发超卖。
|
||
- 代理唯一键为 `scheme + host + port + username + credentialVersion`;日志
|
||
和指标不得暴露密码。
|
||
- TTL 优先级为响应 `expiresAt`、响应 `ttl`、配置固定 TTL、不过期;内部
|
||
时间统一 UTC。
|
||
- 健康检查至少区分全局健康和 Routing/目标健康,并使用抖动和并发上限。
|
||
- GET/HEAD 可按配置安全重试;非幂等方法默认不自动重试;CONNECT 建立后
|
||
不透明重放。
|
||
- 默认不直连;所有 Upstream 不可用时必须显式选择 reject、wait 或 direct。
|
||
- Gateway、Distribution、Admin、Metrics 使用独立监听和认证/访问控制。
|
||
- 非回环监听且无认证、无 CIDR 保护时,严格模式必须拒绝启动。
|
||
|
||
## 集群与性能
|
||
|
||
- 用户补充:高峰可能达到 100,000 请求/秒。
|
||
- 数据面采用多 Worker,本地不可变代理快照和本地容量计数。
|
||
- 同一代理必须由单个 Worker 所有,或由控制面下发容量切片;禁止每请求
|
||
访问 Redis 做全局并发计数。
|
||
- 控制面集中 Provider 获取、独立限流、singleflight、Leader 选举、状态
|
||
持久化和快照分发。
|
||
- 副本数必须由单 Worker 实测能力、目标利用率和故障域余量计算。
|
||
|
||
## 配置模型
|
||
|
||
顶层包含:`version`、`defaults`、`security`、`gateway`、`distribution`、
|
||
`admin`、`metrics`、`storage`、`routing`、`upstreams`。
|
||
|
||
每个 Upstream 包含:`enabled`、`exposure`、`provider`、`api`、`proxyAuth`、
|
||
`pool`、`capacity`、`lifecycle`、`fetch`、`check`。
|
||
|
||
Routing 自上而下匹配,首条命中停止;支持 Gateway 与 Extract 两种 purpose,
|
||
策略至少包括 sequential、random、roundRobin、weighted、leastConnections。
|
||
|
||
## 必测场景
|
||
|
||
- 连续 4 次空后成功不得切换;连续 5 次空只切换一次。
|
||
- 100 个并发缺池请求只触发有限次 Provider fetch。
|
||
- 并发切换不能从 A 一次跳到 C。
|
||
- 并发 fetch 不得突破 pool.maxSize 或 fetch.maxTotal。
|
||
- TTL safety margin 内不得分配。
|
||
- Gateway 与 Extract 共享池时不得容量超卖或重复提取。
|
||
- 配置原子热更新期间请求不中断。
|
||
- Provider 超时不得计入 Empty Fetch。
|
||
- 重复代理不得重复入池,也不得触发空结果切换。
|
||
- 所有 Upstream 不可用时按显式策略执行。
|
||
|