一个配置错误:30个账号只用6个出口
先看我当时的账号池配置,这是风控最忌讳的写法:
accounts:
- {id: "mat_013", proxy: "static://112.xx.xx.41:8899"}
- {id: "mat_014", proxy: "static://112.xx.xx.41:8899"} # 同出口
- {id: "mat_015", proxy: "static://112.xx.xx.41:8899"}
- {id: "mat_016", proxy: "static://120.xx.xx.77:8899"}
30个账号挂着6个静态代理IP,平均5个号共用一条出口。从资源角度看没毛病,每条IP的带宽和并发压力都很小。但票务平台的风控不看出口压力,它看的是行为聚类:同一IP下的多个账号,在开抢后第0.8秒同时打向同一个库存接口,UA、分辨率、请求头顺序全都一致,这在风控模型里就是一个人开了五台电脑。
结果是开抢前3分钟,11个账号被踢进验证码池。我一开始以为是账号质量的问题,换了一批新号,第二场照样挂,来回折腾才回头查IP。这个坑我踩了三次才认账:静态代理IP的性价比,不能按每条多少钱算,要按“每个独立身份能活多久”算。
静态、动态、隧道:票务场景实测对比
我用同一套抢票脚本(100个账号、同一场次、三轮压测)跑了四种方案,数据如下:
| 方案 | 成本参考 | P95延迟 | 会话稳定性 | 30天封号率 |
|---|
| 免费公开代理 | 0元 | 1200-4000ms | 几分钟断一次 | 91.5% |
| 动态短效IP | 0.0022元/IP起 | 80-200ms | 单次请求即换 | 8.2% |
| 隧道代理 | 16元/天起 | 40-90ms | 自动轮换 | 5.6% |
| 静态代理IP | 35元/IP/月 | 12-25ms | 长期不变 | 1.4% |
差距最大的是延迟和数据最后一列。抢票对响应速度的容忍度极低,动态代理每次请求换出口,意味着TLS握手、Cookie绑定、登录态全部重来一遍;静态IP能把P95延迟压到25ms以内,开抢瞬间多个账号的请求发出时间差控制在30ms内,在整点抢购里这就是有票和没票的区别。
但静态方案也不是闭眼上。我第一轮测试直接给100个账号配了100条静态IP,月成本冲到3500元,跑了两周才发现,只有大促那两天需要全量IP,平时做内容分发和关键词监控,20条就够用。多花的钱纯属浪费。
多账号矩阵的IP分配模型
现在我的分配逻辑按账号的业务权重分三层,不再一刀切:
- 核心账号(抢票、秒杀,约15个):1账号对1条静态代理IP,长期绑定,不参与任何轮换
- 次核心账号(内容分发、评论互动,约40个):1条IP绑2-3个账号,但同一IP下的账号操作时间必须错开90秒以上
- 长尾账号(SEO监控、数据采集,约60个):走动态或隧道代理,成本压到最低
这样静态代理IP只需采购15-20条,包月成本600元上下,比全量静态方案省掉八成预算,封号率反而更低。省下来的钱投到号码资源和验证码打码上,投产比高得多。
判断一条IP能不能给两个账号共用,我的土办法是看“行为向量”重不重合:请求时间间隔、UA版本、屏幕指纹、请求头顺序。这几项里有超过两项对上的,宁可多买一条IP,也别省这个钱。
落地参数与效果验证
接入时几个参数必须锁死,否则前面的模型全白搭:
- 连接超时设1.5s、读超时设3s,票务场景等不起重试
- 开启长连接复用,keep-alive 保持60s,避免开抢瞬间重新握手
- IP与账号的映射写进Redis,key用account_id,防止脚本重启后绑定错乱
- 每条IP独立健康检查,连续失败3次立即从池中摘除
按这套改完,同一场演唱会门票我压测了三次:成功率从61%提到94.7%,第三次票源充足时跑到99.1%,P95延迟稳定在18-22ms,整个抢购窗口期没有账号掉线。
说个边界:这套模型在100个账号量级够用。如果矩阵扩到500以上,静态IP的采购成本和人工绑定维护会变成新瓶颈,那时候应该按业务线拆成独立调度集群,而不是继续加IP——我自己还没跑到那个量级,不敢下结论。
静态代理IP的市面报价差得不小,我现在这条线路走的是蚂蚁代理(mayihttp.com),选它的理由很实际:延迟能稳在15ms以内、IP纯净度够、支持指定城市,做区域性票务测试时省了不少事。但如果你只是跑轻量采集,动态代理更划算,不必为静态的稳定性付溢价。