上周三凌晨两点,比价平台的告警把我叫醒:OTA 价格抓取成功率从 94.2% 掉到 61.3%,429 响应占比冲到 23%。我第一反应是并发打太高,把线程池从 200 砍到 80,成功率只回到 68%——说明不是压力问题,是出口 IP 出了问题。把动态隧道切成城市级静态线路后,同一批任务成功率回到 99.1%,P95 延迟从 1.8s 降到 640ms。这篇就把这次换血的账算清楚。
比价场景里,动态和静态不是替代关系
旅游比价的业务特征很别扭:一个城市要同时打携程、美团、飞猪三家的酒店列表,比价的前提是同一批 SKU 的价格快照能对齐。动态隧道每次请求换出口,目标站看到的是「同一组查询参数在十分钟内跳了五个城市」,风控打分直接拉满。我们在两个城市做过 A/B:动态每请求轮换,429 触发率 18.7%;静态长连 3 小时,429 只有 2.1%。
但静态 IP 的单价是动态的几十倍,光看 IP 单价会得出错误结论。真实的账要按「有效请求成本」算——成功拿到价格的那一次请求,摊了多少代理钱。这也是我后来做选型的唯一口径。
说句实话,我一开始想的是全量上静态最稳。跑了一周账单出来,成本翻了 6 倍,业务方一句「你这个月预算超了」直接否掉。所以最终落地的是混合方案:静态扛核心城市和高频 SKU,动态兜底长尾城市,静态只占请求量的 62%。
三档静态资源,实测矩阵
市面上能买到的静态代理IP基本落在三档,我把两周的实测数据摊在下面。测试口径统一:同一批 2000 个酒店详情页,单 IP 并发 10,连续跑 7 天。
| 类型 | P95 延迟 | 7日可用率 | 单IP月成本 | 封禁后恢复 | 单IP安全并发槽 |
|---|
| IDC 机房静态 | 32ms | 99.2% | 45-90 元 | 换IP 约 5 分钟 | 8-12 |
| 住宅静态 | 210ms | 97.4% | 300-600 元 | 换IP 30 分钟以上 | 3-5 |
| 云主机自建 | 18ms | 99.6%(含自运维) | 25 元 + 人力 | 换弹性IP 1 分钟 | 10-16 |
机房静态是性价比主力,延迟和成本都够看,适合绝大多数常规列表页。住宅静态只在被目标站频繁点名时才值得上,我们的用法是「某城市机房段整体被拉黑后,用 5 个住宅 IP 顶住核心 SKU 的比价链路」,日常不开。
云主机自建延迟最低,但有个坑我踩过:C 段太集中。我们有一次在同一个 /24 段里开了 11 个弹性 IP,结果 40 分钟内全部失效——目标站是按网段做批量封禁的,不是按单个 IP。这件事之后,采购时我把「同城市 IP 至少落在 3 个不同 /24」写进了验收标准。
决策树:按请求量和地域粒度落配置
把上面的结论变成可执行的步骤,我们内部就是这么走的:
- 先确认目标站是否做「会话-IP」绑定。绑定的(订单类、会员价接口)必须静态,没绑定的走动态就够。
- 按城市分桶,单城市所需静态 IP 数 = 该城市峰值 QPS ÷ 单 IP 安全并发槽(取 8)。我们核心 12 个城市,每城 3-5 个静态 IP,合计 46 个。
- 验收时校验 C 段分散度,同城 IP 跨 /24 数量 ≥ 3。
- 配熔断:单 IP 连续 5 次 429 或 3 次 403 立即降权到 20%,10 分钟无错误线性回升。
- 动态池保留 20% 容量做兜底,静态池可用 IP 数低于阈值时自动接管道。
调度器我们用加权随机 + 失败降权,权重公式 weight = base × 0.5^fails,失败一次砍半,比直接摘除 IP 更平滑,不会在恢复期造成流量集中。
def pick(city, pool, now):
cands = [ip for ip in pool[city] if ip.cooldown < now]
if not cands:
return fallback_dynamic(city)
total = sum(ip.weight for ip in cands)
r = random.uniform(0, total)
for ip in cands:
r -= ip.weight
if r <= 0:
return ip
return cands[-1]
上线两周的账单,和一个反直觉的坑
跑满两周的数据:业务成功率 99.1%,P95 延迟 640ms,摊到有效请求上的成本是 0.0031 元/次,比之前纯动态方案的 0.0047 元还低——动态虽然 IP 便宜,但失败重试把量吃掉了。月度总支出 2180 元(46 个静态 IP + 动态兜底)。
最后说个大多数选型文不写的指标:TCP 可用率不等于业务可用率。我们测过一家标称可用率 99.9% 的线路,TCP 握手确实几乎不掉,但目标站返回的是验证码页,实际拿到价格的比例只有 71%。所以验收时一定要加一条:用真实目标页做 1000 次请求,统计「拿到有效 JSON」的比例,别信面板上的连通率。
给个明确结论:日请求百万级、有城市粒度要求的比价类业务,机房静态打底 + 20% 动态兜底是最优解,住宅静态只做应急;如果你的量在十万级以下,别自建,直接买现成的城市级静态线路更划算。我们池子里那部分机房静态资源走的是 mayihttp.com 的城市线路,看中的就是按城市分桶和 C 段分散这两点,接入方式和计价在官网能自己核,不用听我转述。