proxy-pool/findings.md

86 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 对话内容提取结果
## 权威来源
- 文件:`对话内容.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` 属于 UpstreamSequential 当前选择属于 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 不可用时按显式策略执行。