xc-0017不是用户发来的。
它来自一位愤怒的站点管理员。
上午九点,楼上五金店的传真机刚换完纸,机器便连续响了三声。老板以为是进货单,看到“造成拨号网关拥塞”几个字,直接拿着传真冲下楼。马飞正在给三个客户演示资料库,他只说了句抱歉,关掉投影,把抓取电话线先拔下来。
客户问演示怎么办。
“本地功能继续,联网部分延期。今天占用的时间不计费。”
陈维明公司的技术员也在其中。他没有离开,反而把自己带来的插线板借给周成保存日志。
传真纸从机器里吐出来时,字迹有些发虚,语气却非常清楚:
“你方程序于凌晨一点至三点反复访问本校材料数据库,造成拨号网关拥塞。请立即停止。”
马飞看完,把正在运行的抓取任务全部暂停。
半地下室里那台新添的测试机刚完成一轮队列扩展。为了增加高校公开资料覆盖,程序把三所学校的镜像目录拆成数百个地址,再按失败次数自动重试。
旧调度器有单站点间隔。
新队列也有。
问题出在断线恢复。
每次拨号重连,程序会从磁盘载入未完成队列,却没有恢复各站点的上次访问时间。对它而言,所有地址都像第一次出现。某个站点响应缓慢,任务失败后又被放回队尾;重连一次,限频时钟便清零一次。
“一晚上四百一十三次。”苏雨桐把日志推到马飞面前。
正常预算是五十次。那四百一十三次里,最长间隔只有十二秒,最短不到一秒。周成把自己测试过的断点文件拿出来,页面内容确实没有重复下载;站点访问时钟却只存在内存里,一断线就归零。
兼职程序员周成脸色发白:“我测过断点续传。”
“你测的是文件。”马飞说,“没测对别人机器的影响。”
“那套数据库本来就是公开的。”
“公开不等于可以把门挤坏。”
周成低头不说话。他是兼职程序员,按完成的功能拿补贴,这次队列扩展原本能让有效页面数在月底前多两成。覆盖数字写在他的阶段目标里。
“这次不扣你的补贴。”马飞把目标表撕下来,“指标是我定的,只写了增加覆盖,没写重连后仍遵守频率。故障分析你主笔,修复要过苏雨桐的破坏性测试。”
周成抬头:“如果两天修不好?”
“抓取继续停。客户库先用现有资料交付。”
马飞先回传真。
他没有解释星辰的技术困难,只承认访问来自他们的程序,说明任务已经暂停,并留下电话和完整日志时间段,请对方确认网关恢复情况。
二十分钟后,电话打了过来。
管理员姓高,说数据库没有损坏,但夜间线路本就只有两条,星辰的重试占满了其中一条。
“我们公开资料,是给人查的,不是给机器搬家的。”高老师说。
电话背景里有人不断问网关能不能用。高老师每回答一句,语气就更硬一点。马飞拿笔记下对方两条拨号线、夜间值班和受影响时段,没有插话辩解自己的并发量其实只有一个。
马飞停了一下:“您愿意规定机器怎么访问吗?”
“什么意思?”
“比如每天最多多少次,什么时段,哪些目录不能抓。我们把规则写进程序。”
电话那头沉默片刻。
“先把你们是谁写清楚。别再装成普通浏览器。”
这句话击中了另一个问题。
为了兼容几个老站点,周成让抓取程序使用了常见浏览器标识。这样成功率更高,却让管理员无法从日志中判断访问者是谁。
马飞在木板上新增了xc-0017,又单独开了一张整改表。
第一项:程序使用明确名称,附联系邮箱。
第二项:限频状态写入磁盘,断线重启后不得清零。
第三项:每个站点设置每日访问预算。
第四项:站点提出退出后,二十四小时内停止并从后续队列排除。
第五项:保留来源和最后抓取时间,不用复制内容冒充星辰自有资料。
周成看着表:“这样会少很多页面。”
“对。”
“覆盖率会很难看。”
“那就让它难看。”
苏雨桐又把月度覆盖目标改成两行:新增有效页面数,以及因限频、退出和预算主动放弃的页面数。两行必须一起报,不能只把前一行贴在墙上。
午饭没人有胃口。楼上老板还是送下来一锅西红柿鸡蛋面,锅底有些糊。周成端着碗蹲在测试机旁,忽然问:“如果管理员永远不让抓呢?”
“就不抓。”马飞说。
“那竞争对手抓了,结果比我们多。”
“用户会看见他多,也会看见我们少。这个代价由公司承担,不由对方线路承担。”
苏雨桐把第五项下面又加了一行:
纠错不静默篡改。
如果站点内容后来改变,星辰可以更新索引,但必须知道旧记录从哪里来、何时失效。增长不能成为抹掉历史的理由。
他们用了两天重写调度器。
苏雨桐故意在测试过程中拔线十九次,又把系统时钟往前拨、往后拨,模拟重启和跨日。周成的第一版在日期回退时重新获得预算,被她当场打回。第二版把最后访问时间和预算流水同时写盘,任何时钟异常都先暂停,等待人工确认。
第三版测试结束时,四百一十三次访问被稳定压到四十八次。覆盖统计少了七百多个候选地址,问题木板上却没有再多出一封投诉。
第三天晚上,程序重新连接材料数据库。新的访问标识出现在对方日志里,每次请求间隔三十秒,失败两次后自动暂停,等待下一日预算。
覆盖速度降到原来的四分之一。
电话费没有下降,因为连接时间更长。
这是一笔真实成本。
高老师收到测试日志后,只回了一句:
“这样可以继续。”
他随后发来一张目录边界表:论文摘要、实验室介绍可访问,学生临时页和内部检索结果禁止;每天凌晨一点到三点最多六十次。表格末尾还有网络中心值班电话。
周成把它逐项录入站点配置,第一次运行前主动打电话请对方看日志。三十分钟后,高老师在电话里报出抓取程序的名称和联系邮箱,两个都能读出来。
马飞把传真和整改表装订在一起。
传真原件已经被热敏纸的温度烤得微卷,字迹以后还会变淡。苏雨桐让他复印一份,原件密封保存,退出目录则单独抄进只读配置。
当天夜里一点,抓取程序按新预算启动。半地下室很安静,屏幕每隔三十秒才滚动一行。周成守到第二十次请求,确认断线重拨后计数从二十一继续,没有回到零。
他在值班表上签字,关掉那条被禁止的学生目录,起身去洗已经凝了油的面碗。