演示开始后的前七分钟,一切正常。
丁卓先接入云监控测试告警,又从本地测试机登记一次版本发布。大屏上的时间线按顺序出现两条记录,嘉禾业务人员随后认领事件,在“责任去向”里指定复核人。
周衡没有用预先生成的漂亮报告。他让采购临时选择一条事件,现场导出。报告首页显示影响、接手人与处理状态,技术附件保留来源和时间,尚未复核的事项单独列在最后。
一名采购人员问:“如果我们今天不点复核,它会不会为了完成演示自动关闭?”
“不会。报告会一直写未复核,直到有权限的人处理或明确接受风险。”
对方刚在问题清单里打完勾,右上角的连接状态便开始闪动。
连接标志变灰的同时,大屏上的事件列表停止刷新。
丁卓先看自己的电脑,又看会议室墙边的网络面板。
“不是刻度云服务挂了。现场有线、无线都断了。”
嘉禾采购下意识看向周衡:“刚才还好好的,演示能继续吗?”
“云端页面不能继续。”周衡说。
他没有把断网说成刻度云预先设计的惊喜,也没有让丁卓切到手机热点,假装场地网络一直正常。
演示原本分成两部分:本地代理收集测试环境的告警和变更,再通过网络送到刻度云;云端把不同来源的记录排成事件时间线,并供用户接手、复核和导出报告。
现在网络断开,本地代理仍在运行,云端却收不到新内容。远程通知、多人协作和在线报告都不可用。
“能看到本地发生了什么吗?”罗致远问。
“能看代理自己的缓存状态,不能把它说成完整云端服务。”
周衡把投影切到测试机上的本地状态页。页面很简单,只显示代理是否运行、最后一次成功连接时间、未发送事件数量和本地磁盘占用。
断网后的第一分钟,待发送数量从零涨到二十七。
丁卓按原定演示脚本启动三类测试数据。一类模拟服务器响应变慢,一类模拟版本发布,一类模拟本地进程重启。事件仍然由测试程序产生,没有接入嘉禾真实生产系统。
本地代理为每条记录保存来源时间、接收顺序和唯一编号,写入自己的缓存文件。它不需要外网才能知道本机收到了什么,却无法确认云端是否已经接受,也无法让会议室外的人及时看到。
采购问:“如果现在真是生产事故,你们会不会完全不报警?”
“跨网络的云端告警会延迟。”周衡说,“客户若配置本地通知,可以在现场收到;没有配置,就只能等网络恢复。这个版本不能绕过断掉的通信线路。”
“那跟免费平台有什么区别?”
“单看云端是否可访问,没区别。网络断了,浏览器都打不开。区别只在本地代理是否保留断网期间的证据,恢复以后能不能按原顺序补回。”
周衡请技术人员直接检查本地文件。刚才断网后发生的事件仍在增加,编号连续,时间清楚。采购已经站起身,走到投影边看那列不断向前的数字。
会议室里有人打开大型云平台的免费故障看板,同样停在加载页面。没有人因此嘲笑它做得差,现场网络到外部的出口断开,任何云端页面都不该凭空出现。
两点十一分,待发送记录超过两百条。
本地状态页仍然能打开,但周衡让丁卓停止连续灌入,先查看缓存文件是否正常轮转。磁盘空间足够,旧文件没有被新记录覆盖,代理重启后也能从上一个已确认位置继续。
为了验证这一点,罗致远临时加了一项测试。
“把代理停一次。断网、进程也停,看记录会不会乱。”
丁卓没有直接结束进程。他先把当前待发送数量写进演示记录,经现场确认后正常停止代理,再过十秒重新启动。
重启后的数量与停止前一致。代理没有把尚未收到云端确认的记录当成已完成,也没有从头重复生成另一批编号。
周衡提醒:“这是正常停止重启。机器突然断电还要看磁盘是否来得及落盘,不能用这一项代替断电测试。”
嘉禾技术人员把“断电恢复另行验证”写进问题清单。
两点十六分,物业在群里回复:楼层网络设备升级时一条上联配置没有恢复,正在回退,预计十分钟内完成。
原因很普通。
没有竞争对手干扰,也没有谁专门挑演示时间制造故障。一次平常的基础设施变更,恰好发生在所有人盯着大屏的时候。
等待期间,周衡把本地记录投上大屏。故障发生前一分钟,谁发布了版本,哪台机器先报警,进程何时重启,全在上面。采购原本已经合上的笔记本又打开了。
采购看完问:“如果昨天我们仓库断网时装了这个,值班的人就不用靠回忆写报告了?”
“对。网络可以晚恢复,发生过什么不用跟着一起丢。”周衡点开一条记录,原始时间和操作编号清清楚楚。业务负责人拿起手机,叫负责昨天那场故障的人上来听后半场。
两点二十四分,连接标志重新变绿。
网络中断正好十七分钟。
丁卓把断网开始的两点零七分、恢复的两点二十四分和物业故障说明一起写进演示记录。时间来自现场设备与网络日志,不靠参会人员事后估算。
本地状态页显示,共有六百三十七条事件等待上传。
代理没有在恢复的一瞬间把全部记录一起推向云端。它按设定速率分批发送,每批收到确认后才推进本地位置;上传中途若再次断开,下一次从最后确认点继续。
大屏上的事件数量逐步增加。
记录不是按“刚刚上传”的时间挤成一团,而是使用来源时间与本地接收顺序还原。版本变更发生在告警之前,进程重启发生在告警之后。重复发送的确认请求只增加接收次数,没有生成第二条事件。
三分钟后,六百三十七条记录全部补传完成。
丁卓用演示前保存的生成清单逐项核对。总数一致,唯一编号没有缺口,三类事件的前后顺序与本地记录相符。
嘉禾技术人员又抽出中间二十条,与本地缓存原文逐项比较。来源时间、接收序号和事件类型一致,只有云端入库时间落在网络恢复以后。
他故意把其中一批重新发送。页面没有多出第二组事件,只在接收详情里增加了重复次数。随后他删除一条本地测试副本,云端已经确认的记录没有跟着消失;本地未确认的另一条则被代理保留,直到服务器给出接收结果。
这些检查多花了十分钟。采购没有催他们跳过,因为四万元首期要验收的恰好不是“断网后数字会涨”,而是断网前后能否对得上。
云端页面恢复了,断网期间却依然有一段无法补回的东西:没有人在云端点接手,也没有远程复核记录。周衡在报告中把这十七分钟标为“协作不可用、本地证据延迟上传”,没有事后补一个虚假的负责人。
这条限制也进入了正式评审意见,没有藏在技术附件最后一页。
罗致远问:“如果要做到网络断开也能多人协作呢?”
“要增加本地控制端和权限同步,范围、部署复杂度与安全责任都会变。当前四万元里程碑没有这项,不能现场答应以后免费补。”
“那代理所在机器坏了呢?”
“当前单机代理会中断。可以部署双实例,但两边如何去重、谁保存最终位置都要重新测试。今天只能把它列成风险,不能用刚才一次正常重启证明机器损坏也没问题。”
罗致远让技术人员把双实例与断电恢复记入后续需求池,不加入当天验收。范围没有因为现场提问就悄悄扩大。
采购没有因为这句话中止演示。
相反,修订后的独占条款、断网限制和补传结果被一并写进评审意见。嘉禾技术部门确认,现有能力满足限定场景试点;断电恢复与本地多人协作作为后续评估项,不放进首期验收。
会议结束前,采购把合同状态从“待演示”改成“待签署”。
首个四万元里程碑的验收范围也最终落定:三类数据接入、断网缓存、按序补传、事件时间线与事故报告。
散会后,技术人员围在测试机前,没人急着走。原来准备问价格能否再压一压的采购,把问题单折进包里,转而问周衡最快哪天能进场。
“周一。按今天确定的范围,五个工作日。”
罗致远当场让助理腾出了下周的会议室:“留给刻度。其他培训往后挪。”
丁卓抱着电脑跟出门,走到没人处才低声说:“刚断网的时候,我以为今天完了。”
周衡看着手机上新发来的入场安排,笑了:“结果替我们做了十七分钟广告。”
采购追到电梯边,请他等一下。盖章版合同已经发进邮箱,四万元的付款申请也提前建好,只等最后验收。