晚上十一点二十八分,周衡把旧适配器从测试链路里摘了下来。
容器没有删除,日志和配置也没有改。他先固定镜像编号、测试凭据版本和十条失败事件的队列位置,再让丁卓导出网络记录。连接成功与事件拒收必须同时留下,不能等修好以后只保留一张绿色页面。
澜桥的生产环境没有受到影响。
旧适配器用的是隔离队列和测试密钥,刻度云也只连向测试地址。现在停掉它,损失的是剩余十个多小时,不是数万张真实票。
客户业务负责人又问了一次:“第二版签名能不能先在生产网关旁边试?只读,不改订单。”
“签名请求本身也会占用网关接口,还可能推进事件游标。”周衡说,“兼容层没通过回放以前,不进生产。只读不等于没有副作用。”
对方没有再催开放权限,只要求每小时收到一次状态。
周衡把第一条状态写得很短:旧适配器失效;生产未接入;改用最小兼容方案;下一次更新时间零点三十分。
不是“正在紧急修复”,也没有写预计几分钟恢复。
周衡放弃修补旧包,直接写一个只覆盖本次试点的兼容层。旧适配器带着十几个用不上的功能,真正需要的是四个字段和可靠的确认过程。
“厂商要是明天才回呢?”丁卓问。
“那我们先把能交的做出来。”
十一点四十七分,澜桥发来签名说明的正式版本。
第二版在客户端标识和时间戳之外,增加了随机数、请求路径、正文摘要和一次性序号。五项内容要按固定顺序拼接,路径必须保留查询参数,网关收到请求后还会检查时间偏差与序号是否重复。
丁卓核对客户样例,周衡负责请求与确认。两个人把任务拆开,新接口的数据很快进入同一套测试流程。
零点零六分,新兼容层发出第一条请求。
网关返回签名错误。
不是版本不支持,而是摘要不一致。周衡把本地参与签名的五段内容逐项打印成不可还原密钥的校验记录,与客户示例对照。前四段一致,最后的请求路径少了一个经过编码的队列参数。
旧说明只签路径主体,第二版要连排序后的查询项一起签。程序实际访问的地址正确,签名使用的却是编码前字符串。
周衡没有增加一个“签名失败就忽略查询项”的兼容开关。他把路径规范化集中到同一处,让发出的地址和参与签名的地址由一个对象生成,再补上空参数、中文队列名和参数换序三组测试。
零点二十九分,第一批十条事件进入刻度云。
来源系统、事件类型、发生时间和状态都能识别,页面终于出现数字。澜桥业务负责人发来一句“是不是可以了”,周衡只回复第一项通过,确认与失败恢复仍在测试。
丁卓故意重放同一批数据。
网关拒绝了复用的随机数,符合文档要求。换用新随机数重新拉取,刻度云保留第一次接收序号,没有生成第二组事件。兼容层收到确认后把测试游标从零推进到十,再次启动时从十一开始。
接着,他在刻度云返回确认前切断网络。
兼容层没有先向网关报成功,十条事件仍留在未确认区。网络恢复后,它用新签名重新发送;刻度云依据事件编号识别重复,返回原确认结果,网关游标这才继续推进。
这些步骤比把两千四百条一次灌进去慢得多,却是在确认重试不会把事件吞掉。
凌晨一点,按前夜排期时定下的规则,两个人交换检查。