五一长假前夕,我给 20 个采集节点穿上了“防弹衣”。去年这个时候,我还在办公室里对着 Excel 表格算工资、算社保、算下个月的办公室租金,焦虑得头皮发麻。现在,我只需要盯着屏幕上这 20 个 IP 的请求延迟和异常日志,盘算着晚上那顿鸡胸肉沙拉能不能再加 50 克糙米。这种对比,荒诞又真实。
去年扩张那会儿,真是脑子进了水。以为人多力量大,接了十几个外包项目,招了七八个人,结果呢?每天一睁眼就是几万块的固定支出。最崩溃的是,人根本管不住。一个简单的数据采集需求,跟产品讲,产品理解偏差了;跟开发讲,开发说技术实现不了要加钱;测试那边又报了一堆莫名其妙的 Bug。我像个救火队长,在需求、代码、抱怨和离职申请之间疲于奔命。赚的那点流水,全填进了管理这个无底洞,自由和时间被榨得一滴不剩。那段时间,我甚至怀念起 2017 年一个人通宵写爬虫的日子,虽然累,但代码是听话的。
所以今年初,我断尾求生了。团队解散,只留了两个长期合作的远程技术。项目砍掉一多半,只做最擅长、利润率也最高的数据自动化采集和清洗。一下子,世界清静了。我不再需要关心谁的 KPI 没达标,谁又因为报销单格式不对在闹情绪。我的战场,重新回到了代码编辑器、服务器终端和 API 文档里。
说回这 20 个节点。这是一个金融舆情监控的项目,要求 7×24 小时不间断地从几十个资讯网站和论坛抓取数据。对方要求高可用,不能崩,尤其是在五一这种长假,流量波动大,对方技术也放假,出了问题就是大事。所谓的“防弹衣”,其实就是一套异常自愈和动态调度系统。核心就三块:心跳监测、失败重试池、IP 池动态轮换。
心跳监测好做,每个节点每分钟上报一次状态,包含 CPU、内存、当前任务队列。麻烦的是失败重试策略。不能无脑重试,有些网站返回 403 就是封你了,再试一万次也没用。我得根据 HTTP 状态码、响应内容里的特定关键词(比如“访问过于频繁”、“请验证”),来区分是临时故障还是永久封禁。临时故障的,进入延迟重试队列,指数退避;永久封禁的,立刻标记该 IP 失效,从可用池里踢出去,并触发告警。
IP 池动态轮换才是精髓。我们手里有这 20 个代理节点,分布在不同的云服务商和地域。不能平均用力,得根据目标网站的反爬策略智能调度。有些站对 AWS 的 IP 特别敏感,那就多用 GCP 和阿里云的节点去碰;有些站晚上审核松,那就把请求压力集中在夜间。我写了个简单的决策树,根据历史成功率、响应时间、以及最近一次被封的“罪名”,来给每个节点-目标网站的组合打分,实时调整流量分配。这就好比给每个侦察兵配了不同的伪装和行进路线,避开敌人的火力点。
搞完这些,已经晚上十点了。我保存代码,提交到 Git,在服务器上部署更新。看着监控面板上 20 条绿色的状态线平稳地波动,一种久违的、纯粹的掌控感回来了。这种快乐,比收到项目尾款还要踏实。因为我知道,这套系统在替我赚钱,在假期里也会忠实地工作,而我,只需要偶尔看一眼手机上的报警推送。
少即是多,慢即是快。以前觉得这是鸡汤,现在觉得是真理。当你砍掉所有枝蔓,只留下最核心的树干,你才有精力去把每一个细节打磨到极致。管理 20 个人带来的心力交瘁,远大于维护 20 个精心设计的程序节点。前者消耗的是不可再生的情绪和人际关系,后者积累的是可复用、可迭代的技术资产。
晚饭最终还是只吃了 300 克沙拉和 120 克鸡胸肉。碳水?算了,监控脚本还有个边缘 case 没处理完,明天再调吧。这个长假,我终于可以安心地“躺”在后台日志里了。














