代理与重试
如何区分正向与反向代理?
- forward proxy: Client 通过代理访问外部目标; 常用于出口控制和审计;
- reverse proxy: Hertz 接收请求并转发到上游; 常用于网关、聚合和迁移;
- transparent concern: 代理仍需明确 Host、scheme、Header、超时和流式语义;
如何实现受控的反向转发?
client → Hertz proxy → upstream
← status/header/body ←
- 路由重写: 明确原路径到上游路径的映射;
- Header: 删除 hop-by-hop Header,追加规范的转发信息;
- body: 大请求和响应使用流式转发并限制大小;
- 错误: 上游不可达与上游 5xx 分开记录;
- 安全: 不允许用户任意控制目标地址,防止 SSRF 和开放代理;
如何限制重试的总成本?
总 deadline = 第一次尝试 + 退避 + 后续尝试 + 响应余量
如何防止重试放大故障?
- retry storm: 配合限流、熔断和总重试预算;
- 写重复: 使用幂等键和服务端去重;
- 指标: 记录原始请求数、尝试数、最终结果和重试原因;
- 日志: 只在最终失败或策略异常时提升级别,避免每次尝试刷屏;