将node-wreq替换为到 surf ,优化性能,优化镜像体积#9
Merged
Merged
Conversation
Preserve local .gitignore edits before cherry-picking proxy integration commits from worktree.
Add proxy policy/resolver with N2A env precedence and wire account-aware proxy behavior through login, refresh, discovery, request dispatch, and browser fallback paths. Update tests and docs/config examples for HTTP/SOCKS5 and per-account Resin sticky proxy setup.
为每个账号引入 max_concurrency(默认 1)并在账号池无空闲槽位时立即返回 429,避免请求超量时继续调度。同步打通 Admin 前后端字段与回归测试,确保配置可编辑、错误映射稳定且行为可验证。
本次提交聚焦于把 PLAN 中的性能与稳定性改造落到可发布代码:减少请求链路重复分配与锁竞争、缩短流式首包等待、补齐运行期观测与回归测试,并同步容器与配置默认值以降低线上回归风险。 文件级变更说明: - `.gitignore`:允许跟踪 `internal/wreq/wreq_streaming_test.go` 与 `internal/wreq/wreq_streaming_stub_test.go`,避免被通配 `*_test.go` 误忽略。 - `Dockerfile`:Rust target 缓存改为 `sharing=private`;runtime 安装 `node-wreq` 改为 `npm pack + tar`,去掉 `npm init/npm install` 的额外开销与噪音。 - `config.docker.json`:补充 `limits.max_request_body_bytes`、`dispatch.probe_cache_ttl_seconds`、`browser.helper_pool_size`、`debug.pprof_*` 示例默认项。 - `config.example.json`:同步新增 limits/dispatch/browser/debug 配置示例,保证本地与容器配置面一致。 - `internal/app/account_pool.go`:分发候选排序改为复用 `emailKey`;新增基于 snapshot 的候选读取;补充 wreq client 创建计数埋点。 - `internal/app/accounts.go`:账户路径与绝对路径匹配 regex 提升为包级;新增 `getAccountEmailKey` 复用 canonical key,减少重复计算。 - `internal/app/admin.go`:管理端请求体解码切到统一 `decodeBody` 流程,并统一非法请求体错误返回。 - `internal/app/admin_accounts.go`:账号管理读写路径统一使用 `emailKey`;更新/删除/启停账号后触发 dispatch probe 缓存失效。 - `internal/app/admin_conversations.go`:CORS header 改为复用统一中间层函数。 - `internal/app/assets/browser-helper.cjs`:新增可复用的浏览器 helper 资产脚本,支持 pool 模式与长度前缀协议处理。 - `internal/app/assets/browser-login-helper.cjs`:新增独立登录 helper 资产脚本,统一 cookie jar 与请求执行逻辑。 - `internal/app/config.go`:新增 `DispatchConfig`/`BrowserConfig`/`DebugConfig`/`LimitsConfig`;补齐默认值与 CLI 参数(pprof、max-request-body);预计算 prompt retry 前缀。 - `internal/app/conversations.go`:ConversationStore 改为 pointer COW + 预览缓存字段,降低列表与读取路径的深拷贝与扫描开销。 - `internal/app/httpclient_audit.md`:补充 T-4-2 审计结论,记录 http client/transport 复用风险与改造建议。 - `internal/app/main.go`:ServerState 引入 atomic snapshot、slot 原子计数、responseStore、sqliteWriter、静态 JSON 缓存、pprof 与统一 CORS/请求体限制入口。 - `internal/app/main_fresh_thread_test.go`:扩展大规模回归测试,覆盖默认配置、dispatch/probe/cache、decode limit、response store、metrics、browser pool 等关键路径。 - `internal/app/metrics.go`:新增 Prometheus 文本导出实现,补齐请求时延、dispatch inflight、wreq 调用、sqlite 操作、browser helper 等指标面。 - `internal/app/models.go`:Probe 模型路径抽取与并行加载,减少多账号场景下模型构建延迟。 - `internal/app/notion_client.go`:引入 HTTP transport cache(按上游/代理/账号策略键控),减少重复建连与连接池碎片。 - `internal/app/notion_client_best_effort_test.go`:新增 dispatch probe TTL 行为测试、失败重探活与缓存失效回归。 - `internal/app/notion_client_browser_fallback_test.go`:补充 helper 错误分类、脚本路径稳定性、环境变量传播与 pool 相关行为测试。 - `internal/app/notion_client_browser_transport.go`:实现 browser helper pool、帧协议读写、worker 生命周期治理、env 优先级与故障重建机制。 - `internal/app/notion_client_protocol_test.go`:新增 transport cache 复用与命中计数回归,验证 client 构建路径一致性。 - `internal/app/notion_client_wreq_transport.go`:移除内嵌 JS 脚本字面量,改为加载资产脚本;对接新的 wreq 流式读取接口。 - `internal/app/openai.go`:chat/responses 规范化逻辑拆分为“typed parts”入口,减少 payload map 热路径访问。 - `internal/app/openai_types.go`:新增 typed request envelope 与字段解析辅助,为 typed-first decode 提供结构化承载。 - `internal/app/prompt_guard.go`:新增 retry 前缀一次性构建函数,运行期复用预计算 slice。 - `internal/app/request_dispatch.go`:新增 probe cache、wreq client new 指标、dispatch 探活缓存与失效策略。 - `internal/app/response_store.go`:新增 map + min-heap 的响应存储与过期清理结构,替换全表扫描过期策略。 - `internal/app/session_refresh.go`:刷新流程增加 test hook 注入点,并在刷新成功后联动 probe 缓存失效。 - `internal/app/sqlite_store.go`:增加 sqlite pragma、读写分离连接(roDB)与操作耗时指标上报。 - `internal/app/sqlite_writer.go`:新增异步持久化写队列与回退计数,降低请求路径同步写阻塞。 - `internal/wreq/wreq_cgo.go`:cgo 链接参数按平台分支(Windows 去 `-ldl`);引入 begin/read/close 流式 FFI 声明与 Go 侧读关闭实现。 - `internal/wreq/wreq_ffi_compat.h`:新增兼容头,固定 cgo 侧所需的流式 FFI 原型。 - `internal/wreq/wreq_streaming_stub_test.go`:新增非 cgo stub 路径流式接口行为回归。 - `internal/wreq/wreq_streaming_test.go`:新增流式首包与 chunk 间隔行为测试,锁定读写延迟形态。 - `internal/wreq/wreq_stub.go`:stub 实现补齐 `Begin/Read/Close` 接口与字段调整,保持无 cgo 路径可编译一致性。 - `scripts/perf/baseline.sh`:新增一键 baseline 脚本(流式/非流式压测 + pprof 抓取 + summary 汇总)。 - `scripts/perf/payload-chat.json`:新增 baseline 脚本默认请求体模板。 - `wreq-ffi/Cargo.toml`:移除 `once_cell` 依赖,转向标准库 `OnceLock`。 - `wreq-ffi/README.md`:更新 FFI 文档为 `wreq_request_begin/wreq_response_read/wreq_response_close` 流式协议说明。 - `wreq-ffi/build.rs`:生成/刷新仓库内兼容头文件,保障未生成 include 头时的 cgo 编译连通性。 - `wreq-ffi/src/lib.rs`:Rust FFI 主体从 base64 包装迁移到流式句柄读写;新增错误码、响应状态管理与读取超时处理。 Constraint: 本次提交必须排除 `.omx/`、`docs/` 与 `PLAN.md`,并保持现有分支可直接用于发布前验证。 Rejected: 拆分为多次小提交 | 当前改造跨传输层/状态层/测试层强耦合,保持单次一致快照更利于回归与回滚。 Confidence: high Scope-risk: broad Directive: 后续若继续推进 Rust T-3-5,请先安装 `cmake` 并补跑 `cargo test` 后再做 FFI 层迭代。 Tested: `go test ./...`; `go test -race ./...`; `go build ./cmd/notion2api` Not-tested: `cargo test`(当前环境缺少 `cmake`);`scripts/perf/baseline.sh` 的 60s 实压与 profile 采集本次未执行。
将 dd25f9f 起的 4 个提交压缩为 1 个提交,统一交付镜像构建链路修复。 主要变更: - 重构 GitHub Actions 镜像流水线为 amd64/arm64 并行构建 + digest 汇总发布 manifest。 - 增加 QEMU、GHA/Registry 双缓存与缓存作用域,提升跨架构构建命中率与稳定性。 - 统一将 ghcr 镜像名规范化为小写,修复 registry cache/exporter 的 invalid reference format 问题。 - 优化 Dockerfile 构建缓存:前端 npm、apt、Rust 依赖预热层。 - 修复 cargo fetch 预热阶段 manifest 解析失败:预创建 wreq-ffi/src/lib.rs 占位文件。 - 修复 browser fallback 的 node-wreq native 依赖缺失:改为 npm install(包含 optional 平台包),并按 TARGETARCH 增加构建期校验。 影响文件: - .github/workflows/docker-image.yml - Dockerfile
变更逐文件说明: - .github/workflows/docker-image.yml:移除对 wreq-ffi 路径的触发监听,避免无效构建触发。 - .gitignore:删除 internal/wreq 测试白名单与 wreq-ffi 构建产物忽略规则,匹配代码库新结构。 - Dockerfile:移除 Rust/FFI 构建阶段、去除 wreq_ffi 静态库注入与 Node 运行时层;Go 构建改为 CGO_ENABLED=0,并升级 builder 镜像到 go1.25;运行时基础镜像从 Debian 切换为 Alpine,包管理改为 apk,并将 tini 入口改为 /sbin/tini。 - README.md:补充本地源码开发需 Go 1.25.0+ 的说明。 - cmd/notion2api/main.go:移除 internal/wreq 依赖及 backend 打印,入口直接启动 app。 - go.mod:升级 Go 版本到 1.25.0,引入 github.com/enetx/surf 及其依赖。 - go.sum:同步 surf 迁移后的依赖校验和更新。 - internal/app/account_discovery.go:账号发现流程创建登录会话时传入 cfg,统一新传输配置上下文。 - internal/app/account_pool.go:客户端创建计数指标从 wreq 语义改为 transport 语义(standard/streaming 计数逻辑保持不变)。 - internal/app/assets/browser-helper.cjs:删除旧 Node 浏览器 helper 资产文件。 - internal/app/assets/browser-login-helper.cjs:删除旧 Node 登录 helper 资产文件。 - internal/app/config.go:新增 use_surf_helper_transport 配置项,并在默认配置中关闭该开关。 - internal/app/login_helper.go:登录请求链路切换为 loginTransportDoRequest,移除旧 wreq 命名调用。 - internal/app/main_fresh_thread_test.go:同步 transport 指标命名与 Prometheus 系列名断言。 - internal/app/metrics.go:将 wreq 相关调用时延与指标名称统一改为 transport 语义,保持桶与统计行为一致。 - internal/app/notion_client.go:推理链路时延观测切换为 observeTransportCallDuration。 - internal/app/notion_client_best_effort_test.go:同步 transport 客户端计数指标变量与断言。 - internal/app/notion_client_browser_fallback_test.go:移除 Node/wreq helper 相关分支与池化逻辑测试,保留/聚焦 surf 路径所需用例。 - internal/app/notion_client_browser_transport.go:删除 Node helper 子进程池与脚本执行实现,fallback 执行路径统一为 surf;默认常量命名改为 transport 语义。 - internal/app/notion_client_login_transport.go:删除 Node helper JSON 子进程调用路径,登录传输统一走 surf;相关类型/函数命名从 wreq 迁移为 transport。 - internal/app/notion_client_surf_transport.go:新增 surf 传输实现(登录请求与浏览器 fallback),包含代理注入、Cookie 注入与重定向 Cookie 保留逻辑。 - internal/app/notion_client_surf_transport_test.go:新增并完善 surf 传输测试,覆盖状态/头/正文映射、上下文取消、重定向 Cookie 保留、会话 Jar 回写与 NDJSON/HTML 场景。 - internal/app/notion_client_wreq_transport.go:删除旧 wreq 传输实现文件。 - internal/app/request_dispatch.go:客户端创建计数 expvar 名称改为 notion2api_transport_client_new_total。 - internal/app/session_refresh.go:会话刷新时创建登录会话传入 cfg,复用统一传输配置。 - internal/wreq/doc.go:删除已弃用 wreq 包文档文件。 - internal/wreq/wreq_cgo.go:删除已弃用 wreq FFI cgo 实现。 - internal/wreq/wreq_ffi_compat.h:删除已弃用 FFI 兼容头文件。 - internal/wreq/wreq_streaming_stub_test.go:删除已弃用 wreq stub 流式测试。 - internal/wreq/wreq_streaming_test.go:删除已弃用 wreq 流式测试。 - internal/wreq/wreq_stub.go:删除已弃用 wreq stub 实现。 - wreq-ffi/.gitignore:删除已废弃 wreq-ffi 子模块忽略规则。 - wreq-ffi/Cargo.toml:删除已废弃 Rust FFI 包定义。 - wreq-ffi/README.md:删除已废弃 wreq-ffi 说明文档。 - wreq-ffi/build.rs:删除已废弃 FFI 头文件生成脚本。 - wreq-ffi/cbindgen.toml:删除已废弃 cbindgen 配置。 - wreq-ffi/src/lib.rs:删除已废弃 Rust FFI 实现。 验证: - go test ./... - go build ./cmd/notion2api
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
主要变更
1) 传输链路重构:
wreq->surfinternal/app/notion_client_surf_transport.go,使用github.com/enetx/surf实现:internal/app/notion_client_surf_transport_test.go覆盖核心传输行为:2) 删除旧实现与依赖链
internal/wreq/全部文件wreq-ffi/全部文件internal/app/notion_client_wreq_transport.gointernal/app/assets/browser-helper.cjsinternal/app/assets/browser-login-helper.cjs3) Docker 构建与运行时精简
Dockerfile移除 Rust/FFI 构建阶段wreq_ffi静态库与头文件CGO_ENABLED=0golang:1.25.0-bookwormdebian:bookworm-slim切换到alpine:3.22apk add --no-cache ca-certificates tzdata curl tiniENTRYPOINT调整为["/sbin/tini", "--", "docker-entrypoint.sh"]4) 配置、入口与调用路径调整
internal/app/config.go增加use_surf_helper_transport配置项(默认false)cmd/notion2api/main.go移除internal/wreq依赖和 backend 打印5) 指标与命名统一(保持行为)
wreq统一到transport:notion2api_wreq_client_new_total->notion2api_transport_client_new_totalnotion2api_wreq_ffi_call_duration_seconds->notion2api_transport_call_duration_seconds6) 文档与依赖
README.md增补 Go1.25.0+开发前提说明go.mod/go.sum引入surf及其依赖并更新版本兼容性与影响评估
功能层面
wreq/ffi/node-helper改为surf。可观测性层面
wreq->transport)。构建与部署层面
验证
已在本地执行:
go test ./...go build ./cmd/notion2api