| .github/workflows | ||
| api | ||
| cmd | ||
| configs | ||
| deploy | ||
| diagrams | ||
| docs | ||
| examples/config | ||
| gen/controlplane/v1 | ||
| internal | ||
| scripts | ||
| .gitignore | ||
| CONTEXT.md | ||
| findings.md | ||
| go.mod | ||
| go.sum | ||
| progress.md | ||
| README.md | ||
| task_plan.md | ||
| 对话内容.md | ||
Proxy Pool
项目定位
面向多供应商动态代理资源的集中控制、独占提取与高并发转发平台。
Proxy Pool 将供应商接入、短 TTL 代理活动池和管理状态集中到 Controller,
同时提供三类边界清晰的访问方式。集群 100,000 QPS 是设计目标,尚未经过
代表性环境的负载测试证明。
项目背景
不同代理供应商的响应格式、鉴权方式、计费方式和代理存活时间并不一致;部分 代理只有几十秒有效期。系统还需要同时处理容量预留、健康状态、路由切换、 一次性提取和高并发转发。
Proxy Pool 用 Controller 协调这些变化,并让 Gateway 数据面只消费节点内存中的 不可变快照,避免在转发热路径查询 PostgreSQL、Redis 或 Provider API。
使用方式
- Gateway:调用方连接平台,由平台选择上游代理并转发 HTTP 或 HTTPS
CONNECT。
proxy-gateway已装配本地监听、指标探针和控制面 Register/Watch/ACK/ Runtime/Outcome 会话;带凭据 Proxy 的分发与当前内存 View 已闭环。 - Distribution:调用方按条件提取真实代理;成功提取即独占消费,不支持归还、 续租或状态查询。
- Admin:运维人员查询状态、启停 Upstream、切换 Routing,并触发严格配置 重载。Admin 与 Distribution 已由 Controller 运行在独立监听器上。
核心能力
- 严格配置:配置版本 1、YAML 未知字段拒绝、Secret 引用解析、公开监听保护、 引用和容量边界校验。
- Provider 获取与协调:Provider HTTP Client、响应上限、模板解析、分布式 Leader/请求额度、退避和补池 Supervisor 已接入 Controller。
- Redis 活动池:短 TTL Proxy Upsert、去重、健康更新、Worker ownership、 库存、过期清理、Distribution 幂等与分布式限流均使用原子操作或有界流程。
- Distribution:支持
partial/allOrNothing、TTL 与健康过滤、Gateway 库存预留,以及AVAILABLE -> EXTRACTED的一次性独占提取。 - Controller 入口:
proxy-controller已装配 Distribution、Admin、Metrics、 PostgreSQL 迁移与 Redis 活动池,并支持联动优雅停机。 - PostgreSQL 管理面:持久化配置版本、Upstream/Routing 管理状态、Admin 审计与 Outbox;不保存 Proxy 明细或逐次提取记录。
- Gateway 组件:HTTP 正向代理、HTTPS CONNECT、双向 Tunnel、重试、超时、
目的地址保护、本地快照存储、容量调度和 Worker 控制面 Register/Watch/ACK/
Runtime/Outcome 会话组件已有实现与定向测试。每次代理尝试只向本地有界队列写入
Outcome,微批确认失败会重发同一序列;队列满时丢弃观测样本,不阻塞转发请求。
SessionSupervisor会为可恢复控制面中断执行 有界退避重连。Controller 可向 Worker 下发已归属 Proxy、Gateway Routing 与按引用去重的 凭据材料快照。Gateway 会将 Routing、Proxy 与凭据原子编译为同一内存 View,并只按当前未过期 View 匹配请求,并在内存中按 Sequential、Random、Round Robin、Weighted 或 Least Connections 选择上游。无候选时支持 reject、受waitTimeout限制的本地容量等待, 以及仍经过目标地址策略的 direct;proxy-gateway通过独立控制面拨号地址维护 Session,并仅在持有未过期 Snapshot 时 Ready;凭据材料只保留在当前节点内存 View。 - 安全边界:Gateway、Distribution 与 Admin 使用各自的认证语义,并支持 CIDR、可信代理、严格请求解析和敏感信息最小化。
架构概览
flowchart LR
Client[调用方] -->|HTTP / CONNECT| Gateway[proxy-gateway]
Client -->|独占提取| Distribution[Distribution]
Operator[运维人员] -->|管理操作| Admin[Admin]
subgraph CP[proxy-controller 已运行]
Distribution --> Controller[Controller]
Admin --> Controller
end
Controller -->|Fetch| Provider[Provider API]
Controller --> Redis[(Redis)]
Controller --> PostgreSQL[(PostgreSQL)]
Checker[Checker<br/>健康链待闭环] -. Observation .-> Controller
Controller -. gRPC Snapshot .-> Gateway
- PostgreSQL 只保存管理面状态,不保存 Proxy 明细或逐次提取记录。
- Redis 保存短 TTL Proxy 活动池、Provider 协调、Distribution 幂等与分布式 限流等可重建的短期状态。
- Gateway 热路径 只读取节点内存,不查询 PostgreSQL、Redis 或 Provider API。
当前完成度
截至 2026-07-31,实施计划检查项为 56 / 74(75.7%)。详情见 实施计划和 交付完成度审计。
- 已完成:严格配置、Provider 获取与协调、Redis 活动池、Distribution 原子 提取与限流、Controller 的 Admin/Distribution/Metrics 监听,以及 PostgreSQL 管理状态;WorkerControlPlane 的 Register、Snapshot ACK、Runtime 心跳接收和 Redis 会话栅栏,以及 Gateway Outcome 上报的有界队列、序列确认与重试。
- 部分完成:Checker 调度与健康状态链、Docker Compose/ Kubernetes 运行时 mTLS Overlay,以及 protobuf 契约。
- 待完成:Checker 调度与健康状态链,以及 loadgen 和代表性集群压测。
检查项数量不等于生产就绪度。静态部署清单与 protobuf descriptor 验证也不代表
端到端拓扑已经完成;100,000 QPS 仍只是待验证的集群设计目标。
快速开始
前置条件为 Go 1.26、PowerShell,以及用于 fixture 测试的 Docker。先在当前 PowerShell 会话设置本地占位凭据;这些值仅用于本地验证:
$env:PROXY_POOL_GATEWAY_PASSWORD = "LOCAL_GATEWAY_PASSWORD"
$env:PROXY_POOL_EXTRACT_TOKEN = "LOCAL_EXTRACT_TOKEN"
$env:PROXY_POOL_ADMIN_TOKEN = "LOCAL_ADMIN_TOKEN"
$env:PROVIDER_A_TOKEN = "LOCAL_PROVIDER_A_TOKEN"
$env:PROVIDER_B_TOKEN = "LOCAL_PROVIDER_B_TOKEN"
$env:PROXY_POOL_CONFIG_FINGERPRINT_KEY = "LOCAL_HIGH_ENTROPY_KEY_AT_LEAST_32_BYTES"
PROXY_POOL_CONFIG_FINGERPRINT_KEY 在 Admin 启用时必须至少为 32 字节,并与业务
Secret 分离管理。
校验配置并执行仓库验证:
go run ./deploy/tools/configcheck deploy/config/local.yaml
./scripts/verify.ps1
Redis、PostgreSQL 和 Controller fixture 脚本会使用 Docker 启动隔离依赖:
./scripts/test-redis.ps1
./scripts/test-postgres.ps1
./scripts/test-controller.ps1
PostgreSQL 与 Redis 是 Controller 的启动依赖。当前可运行的 Controller 入口如下,
将 CONFIG_FILE 替换为实际配置路径,并确保其中的 PostgreSQL 与 Redis 地址可从
进程所在网络访问:
go run ./cmd/proxy-controller -config CONFIG_FILE
deploy/config/local.yaml 面向 Compose 网络,默认使用
服务名 postgres 和 redis;它可直接用于配置校验,但宿主机执行 go run 时需要
改用宿主机可达的存储地址。
本地配置中的 .invalid Provider URL 是故障演示占位,不会提供真实代理。
Gateway 已提供启动命令;需要先启用 Controller controlPlane 并配置匹配的 mTLS
证书(回环 fixture 可使用明文),再提供独立的拨号地址和 Worker 身份:
go run ./cmd/proxy-gateway -config CONFIG_FILE `
-control-plane CONTROLLER_HOST:8443 `
-cluster-id CLUSTER_ID -worker-id WORKER_ID `
-instance-id INSTANCE_ID -zone ZONE
以上参数也可通过 PROXY_POOL_CONTROL_PLANE_ADDRESS、PROXY_POOL_CLUSTER_ID、
PROXY_POOL_WORKER_ID、PROXY_POOL_INSTANCE_ID 与 PROXY_POOL_ZONE 提供。
Gateway 的 /livez、/readyz、/metrics 使用配置中的 metrics.listen;无有效
Snapshot 时 /readyz 返回 503。Checker 与 loadgen 命令尚未实现。
关键配置与入口
- 本地配置与 完整配置参考
- Distribution API:默认本地入口
http://127.0.0.1:8081 - Admin API:默认本地入口
http://127.0.0.1:8082 - Controller Metrics:默认本地入口
http://127.0.0.1:9090,提供/livez、/readyz和/metrics - 控制面协议:Worker/Checker 的 protobuf 契约; gRPC 运行链尚未闭环
- 运维手册:依赖、探针、发布边界与故障处置
核心不变量
- Gateway 热路径只读节点内存,不访问 PostgreSQL、Redis 或 Provider API。
- Proxy 容量使用
Reserved -> Active原子转换,禁止超卖。 - Distribution 成功时原子执行
AVAILABLE -> EXTRACTED;提取后不归还、不续租。 pool.maxSize是当前未提取库存硬上限;fetch.maxTotal是 Redis generation 内的累计获取停止阈值。- CONNECT 向客户端提交
200后不透明重放。 - 公开监听必须有认证或 CIDR 访问保护。
- PostgreSQL 只保存管理面状态;Proxy 明细只存在于 Redis 短 TTL 活动池和节点 内存,Redis 中的短期状态可由 Provider 重建。
路线图
- P0 - Worker 控制面闭环:Worker session、Snapshot ledger、ACK、运行态接收、 ownership 索引,以及 Gateway 快照客户端。
- P0 - Checker 健康链:Checker 调度、实际探测、Observation reducer,以及
FETCHED -> AVAILABLE / SUSPECT / UNHEALTHY状态链。 - P1 - Gateway 与 Routing:Gateway 进程、快照凭据分发、五种 Routing 策略与
onUnavailable已接入;动态容量调整和 Drain 闭环待完成。 - P1 - 可观测与部署:低基数业务指标、完整 Compose/Kubernetes 进程拓扑, 以及故障转移和恢复演练。
- P2 - 容量证明:
proxy-loadgen、HTTP/CONNECT/Extract 分场景压测,以及 可复现的代表性100,000 QPS集群报告。
文档导航
设计与需求
开发与 API
部署与运维
审计与测试