用途:排查 Electric 同步问题,基于 electric-shapes 与 electric-proxy-auth 两个前置技能。
主要能力与用法:
- 调试日志:在 ShapeStream 的 backoffOptions 中设 debug: true 可查看重试与状态机行为;onError 中判断 FetchError 并始终返回 {} 以重试。
- 重试行为:5xx、429、网络错误自动指数退避重试;4xx(非 429)不自动重试,需在 onError 返回 {} 手动重试;409 shape 过期自动重置重取;MissingHeadersError 永不重试。
- MissingHeadersError:Electric 响应头(electric-offset、electric-handle)被 CORS 剥离,需在代理中设置 Access-Control-Expose-Headers 暴露 electric-offset, electric-handle, electric-schema, electric-cursor。
- 快速循环检测:代理/CDN 缓存键未包含 handle 与 offset 查询参数,导致重复返回同一陈旧响应。需确保缓存键包含全部查询参数;Vercel 可在 vercel.json 中设 CDN-Cache-Control 与 Vercel-CDN-Cache-Control 为 no-store。nginx 应使用 proxy_cache_key $scheme$host$request_uri。该检测在同一 offset 500ms 内 5 次请求后触发,客户端先自动清缓存一次,再退避,连续 5 次检测后抛错。
- SSE 缓冲:nginx 默认 proxy_buffering on 会延迟 SSE,需设 proxy_buffering off;Caddy 用 flush_interval -1。不要完全禁用缓存,Electric 依赖缓存头做请求合并。
- 本地多 shape:浏览器 HTTP/1.1 每源限 6 连接,运行 6 个以上 shape 时请求排队,可用 Caddy 在宿主机(非 Docker)做 HTTP/2 代理。
- 复制槽:Electric 停止时复制槽会无限保留 WAL 撑满磁盘,可执行 psql -c "SELECT pg_drop_replication_slot('electric_slot_default');" 或设置 max_slot_wal_keep_size。
适用场景:Electric 同步异常、缓存陈旧、代理与 CDN 配置、本地开发多 shape、Postgres 复制槽维护。
限制:目标版本为 @electric-sql/client v1.5.10;具体部署配置参见 electric-deployment,onError 语义与退避行为参见 electric-shapes。