代理程序也是程序,升级、改配置、清理异常,总有需要重启的时候。重启本身不难,难的是想清楚:重启的那一瞬间,那些正在进行中的请求到底会怎样。搞明白这一点,你就知道为什么有些重启看起来”没出大事”却留下隐患,也才知道怎么把重启做得更稳。
重启时,三类连接各有各的结局
代理进程停止服务时,处理中的连接大致分三类。正在进行数据传输的请求会直接中断,客户端收到连接断开;已经建立但空闲的连接会被关闭,客户端下次复用时发现连不上,就会重新建立;已经完成认证的会话如果依赖内存状态,重启后一并丢失,需要重新认证。不同的处理方式,决定了客户端接下来是自动恢复还是反复报错。
| 连接状态 | 重启后的结果 | 客户端感知 | 应对方式 |
|---|---|---|---|
| 传输中的请求 | 立即中断 | 报错或超时 | 任务级重试 |
| 空闲长连接 | 被关闭 | 复用失败 | 客户端自动重建 |
| 认证会话 | 状态丢失 | 需要重新认证 | 重连时重新认证 |
| 轮换中的地址 | 释放回池 | 出口发生变化 | 重取地址继续 |
客户端为什么会自己”缓过来”
大多数客户端对连接中断是有准备的:请求失败后会按配置重试,重试通常带退避——第一次等一秒,第二次等两秒,依此类推。代理进程重启往往只要几秒,所以只要任务本身有重试机制,很多请求在重试时就自然恢复了。这也是为什么”重启一下”常常看着没出大事。但如果任务没有重试、或者重试上限设得太低,重启就会变成实实在在的失败。
怎样把重启做得”平滑”
关键是别”硬停”,而是先排空再停。做法是先把代理标记为不接收新连接,让已有请求跑完或超时,等处理中的流量降到零,再真正停止进程;重启后确认连通正常,再恢复接收新连接。配合业务侧的低退避重试,就能把重启的影响从”故障”降到”波动”这个级别。维护窗口选在业务低谷,效果会更好。
- 重启前先排空:停止接收新连接,等存量请求结束
- 业务侧必须有重试:失败请求按退避策略自动重试
- 重启后先自检:确认连通与认证正常,再放量接单
- 选低谷窗口:把重启排在流量低的时段
- 记录重启时间:排查异常时能对得上日志时间线
代理重启像电梯检修:直接断电,里面的人全卡在半空;提前挂上”暂停使用”的牌子,等里面的人走完再检修,一切都在掌控里。
与 IP 代理的关系:代理进程的重启直接影响进行中请求、空闲连接与认证会话三类状态,处理不当会造成批量失败;用先排空再停止的方式重启,并在业务侧配置退避重试,可以把代理维护对业务的影响降到最低。
