proxy-pool/README.md
youfak 6b6fb54075
Some checks are pending
ci / proto (push) Waiting to run
ci / test (ubuntu-latest) (push) Waiting to run
ci / test (windows-latest) (push) Waiting to run
ci / race (push) Waiting to run
ci / integration (push) Waiting to run
feat: publish initial worker snapshots
2026-07-31 13:22:45 +08:00

207 lines
9.4 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.

# Proxy Pool
## 项目定位
面向多供应商动态代理资源的集中控制、独占提取与高并发转发平台。
Proxy Pool 将供应商接入、短 TTL 代理活动池和管理状态集中到 Controller
同时提供三类边界清晰的访问方式。集群 `100,000 QPS` 是设计目标,尚未经过
代表性环境的负载测试证明。
## 项目背景
不同代理供应商的响应格式、鉴权方式、计费方式和代理存活时间并不一致;部分
代理只有几十秒有效期。系统还需要同时处理容量预留、健康状态、路由切换、
一次性提取和高并发转发。
Proxy Pool 用 Controller 协调这些变化,并让 Gateway 数据面只消费节点内存中的
不可变快照,避免在转发热路径查询 PostgreSQL、Redis 或 Provider API。
## 使用方式
- **Gateway**:调用方连接平台,由平台选择上游代理并转发 HTTP 或 HTTPS
CONNECT。当前已有传输、调度和保护链组件命令进程与控制面快照客户端待装配。
- **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、重试、超时、
目的地址保护、本地快照存储和容量调度已有实现与定向测试,但尚无
`proxy-gateway` 命令和控制面客户端。
- **安全边界**Gateway、Distribution 与 Admin 使用各自的认证语义,并支持
CIDR、可信代理、严格请求解析和敏感信息最小化。
## 架构概览
```mermaid
flowchart LR
Client[调用方] -->|HTTP / CONNECT| Gateway[Gateway<br/>进程待装配]
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 -. Snapshot 链待闭环 .-> Gateway
```
- **PostgreSQL** 只保存管理面状态,不保存 Proxy 明细或逐次提取记录。
- **Redis** 保存短 TTL Proxy 活动池、Provider 协调、Distribution 幂等与分布式
限流等可重建的短期状态。
- **Gateway 热路径** 只读取节点内存,不查询 PostgreSQL、Redis 或 Provider API。
## 当前完成度
截至 **2026-07-31**,实施计划检查项为 **53 / 7471.6%**。详情见
[实施计划](docs/development/implementation-plan.md)和
[交付完成度审计](docs/requirements/completion-audit.md)。
- **已完成**严格配置、Provider 获取与协调、Redis 活动池、Distribution 原子
提取与限流、Controller 的 Admin/Distribution/Metrics 监听,以及 PostgreSQL
管理状态WorkerControlPlane 的 Register、Snapshot ACK、Runtime 心跳接收和
Redis 会话栅栏。
- **部分完成**Gateway 传输与调度组件、Snapshot 本地存储、Worker ownership
与运行态领域组件、Docker Compose/Kubernetes 静态部署清单和 protobuf 契约。
- **待完成**Worker 权威 Proxy/Routing Snapshot 发布、Gateway 进程装配、Outcome
上报、Checker 调度与健康状态链、完整 Routing 运行链,以及 loadgen 和代表性集群压测。
检查项数量不等于生产就绪度。静态部署清单与 protobuf descriptor 验证也不代表
端到端拓扑已经完成;`100,000 QPS` 仍只是待验证的集群设计目标。
## 快速开始
前置条件为 Go 1.26、PowerShell以及用于 fixture 测试的 Docker。先在当前
PowerShell 会话设置本地占位凭据;这些值仅用于本地验证:
```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 分离管理。
校验配置并执行仓库验证:
```powershell
go run ./deploy/tools/configcheck deploy/config/local.yaml
./scripts/verify.ps1
```
Redis、PostgreSQL 和 Controller fixture 脚本会使用 Docker 启动隔离依赖:
```powershell
./scripts/test-redis.ps1
./scripts/test-postgres.ps1
./scripts/test-controller.ps1
```
PostgreSQL 与 Redis 是 Controller 的启动依赖。当前可运行的 Controller 入口如下,
`CONFIG_FILE` 替换为实际配置路径,并确保其中的 PostgreSQL 与 Redis 地址可从
进程所在网络访问:
```powershell
go run ./cmd/proxy-controller -config CONFIG_FILE
```
[`deploy/config/local.yaml`](deploy/config/local.yaml) 面向 Compose 网络,默认使用
服务名 `postgres``redis`;它可直接用于配置校验,但宿主机执行 `go run` 时需要
改用宿主机可达的存储地址。
本地配置中的 `.invalid` Provider URL 是故障演示占位,不会提供真实代理。
当前仓库没有 Gateway、Checker 或 loadgen 命令,因此不提供对应启动命令。
## 关键配置与入口
- [本地配置](deploy/config/local.yaml)与
[完整配置参考](docs/configuration/reference.md)
- [Distribution API](docs/api/distribution.md):默认本地入口
`http://127.0.0.1:8081`
- [Admin API](docs/api/admin.md):默认本地入口 `http://127.0.0.1:8082`
- Controller Metrics默认本地入口 `http://127.0.0.1:9090`,提供 `/livez`
`/readyz``/metrics`
- [控制面协议](docs/api/control-plane.md)Worker/Checker 的 protobuf 契约;
gRPC 运行链尚未闭环
- [运维手册](docs/operations/runbook.md):依赖、探针、发布边界与故障处置
## 核心不变量
1. Gateway 热路径只读节点内存,不访问 PostgreSQL、Redis 或 Provider API。
2. Proxy 容量使用 `Reserved -> Active` 原子转换,禁止超卖。
3. Distribution 成功时原子执行 `AVAILABLE -> EXTRACTED`;提取后不归还、不续租。
4. `pool.maxSize` 是当前未提取库存硬上限;`fetch.maxTotal` 是 Redis generation
内的累计获取停止阈值。
5. CONNECT 向客户端提交 `200` 后不透明重放。
6. 公开监听必须有认证或 CIDR 访问保护。
7. 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**`proxy-gateway` 命令、五种 Routing 策略、
`onUnavailable`、动态容量调整和 Drain 闭环。
- **P1 - 可观测与部署**:低基数业务指标、完整 Compose/Kubernetes 进程拓扑,
以及故障转移和恢复演练。
- **P2 - 容量证明**`proxy-loadgen`、HTTP/CONNECT/Extract 分场景压测,以及
可复现的代表性 `100,000 QPS` 集群报告。
## 文档导航
**设计与需求**
- [产品设计](docs/design/product-design.md)
- [总体架构](docs/design/architecture.md)
- [项目结构](docs/design/project-structure.md)
- [需求追踪](docs/requirements/traceability.md)
- [架构决策记录](docs/adr/README.md)
**开发与 API**
- [开发指南](docs/development/guide.md)
- [实施计划](docs/development/implementation-plan.md)
- [配置参考](docs/configuration/reference.md)
- [Distribution API](docs/api/distribution.md)
- [Admin API](docs/api/admin.md)
- [控制面协议](docs/api/control-plane.md)
**部署与运维**
- [本地配置](deploy/config/local.yaml)
- [运维手册](docs/operations/runbook.md)
- [生产就绪检查](docs/operations/production-readiness.md)
- [安全模型](docs/security/security-model.md)
**审计与测试**
- [交付完成度审计](docs/requirements/completion-audit.md)
- [测试策略](docs/testing/strategy.md)
- [详细测试策略](docs/testing/test-strategy.md)
- [故障注入](docs/testing/failure-injection.md)