CHAPTER 048 / 100

第四十八章:企业级项目第一次提测

听这一章

微软云希 · AI 合成朗读 · 14:28

网易云听全书

第一次提测那天,测试环境里一共亮着三块屏幕。

前端页面一块,后端日志一块,模型服务的调用记录一块。

我们几个人坐在会议室里,谁都没说什么豪言壮语。小马哥守着前端,伟源拿着测试用例,我抱着电脑盯日志,桌上还放着几杯已经快凉掉的咖啡。那场面不像项目终于做完了,更像几个人把刚组好的机器推上跑道,准备看它第一圈会掉几个零件。

按我们设计的流程,企业账号提交一批音乐生成任务,系统先校验权限和可用额度,再创建批次,把任务送进模型队列。模型返回结果以后,前端再把每一条任务的状态和生成结果展示出来。

纸面上看,一共也没几步。

真正跑起来以后,每一步都能单独给你开一张事故单。

伟源看了眼时间,语气很平。

“开始吧,先走正常流程。”

小马哥点下提交按钮。

页面上的加载图标转了起来。

一秒。

三秒。

五秒。

转到第八秒的时候,小马哥看了我一眼。

“雷子,这个圈再转两秒,我都想替它加油了。”

我没接他的损话,手已经在翻日志了。后端没有报错,权限校验过了,批次也创建了,问题出在后面那段模型调用上。为了让前端一次拿到完整结果,我们把本来应该异步处理的东西又串回了提交接口里。单条任务还看不出来,一批任务一起进来,接口就只能站在原地等模型一个个回话。

第十一秒,页面终于弹出成功提示。

还没等我们松气,伟源把页面刷新了一下。

列表里出现了两个一模一样的批次。

会议室瞬间安静。

小马哥盯着屏幕:“我刚才好像又点了一下。”

“什么叫好像?”我问。

“就是人类在面对一个转了十秒还没反应的按钮时,做出的自然行为。”

我看着那两个批次号,太阳穴已经开始跳了。

接口慢只是难用,重复提交就不只是难用了。同一批任务生成两次,会占两份资源,结果列表也会多出一套。客户不会关心你当时是网络抖了,还是手快了,他只会指着两份一模一样的结果问你:哪份算数?

伟源没跟着开玩笑,只在用例后面打了个叉。

“第一次提测不通过。”

他说得很平静。

平静得像医生把检查单递给你,顺便告诉你别急,后面还有项目。


第一轮问题很快就被拆开了。

慢,是因为提交接口承担得太多。

重复,是因为我们默认用户只会老老实实点一次。

可真实用户从来不配合默认配置。页面多转两秒,他能点三次;再多转两秒,他还能怀疑是不是鼠标坏了。

我把提交链路重新收了一遍。接口只负责校验、落库和返回批次号,模型生成放回异步队列里跑。小马哥去跟前端对状态,提交成功以后不再让页面傻等结果,而是明确显示“已提交”“排队中”“生成中”。

小璇那边也很快回了消息。

“不要只写处理中。”

“用户要知道系统接到了,也要知道还要等。”

她的两句话,把我们原本想偷懒合并的状态又拆开了。

我本来觉得都是等,写一个“处理中”也能用。后来一想,系统知道自己是在排队还是在生成,用户却只能对着三个字猜。企业端最怕这种猜,猜着猜着,信任就被加载图标转没了。

重复提交这块,我加了一层幂等锁。按企业账号和前端生成的请求编号识别同一次提交,在第一笔请求还没处理完时,后面的相同请求不再重复创建任务。

锁加上以后,我还特意把范围缩得很小。

只护住校验和落库,不跟着模型生成一起占着。

不然重复提交是拦住了,正常请求也全被堵在门口,那就不是保护现场,是把整个测试环境反锁了。

折腾完这一轮,已经过了中午。

我们连会议室都没出,随便叫了几份外卖,边吃边等重新部署。小马哥夹着一块已经凉掉的鸡排,看着发布进度说:

“第一轮就加锁,咱们这项目安全感建立得挺快啊。”

伟源抬头看他一眼。

“先别贫,等会儿上并发。”

小马哥嘴里的鸡排停了半秒。

“你们测试说这种话的时候,为什么总像反派准备放大招?”


第二轮开始以后,前半段顺得让人有点不敢相信。

提交接口不到一秒就返回了。

连续点两次,只创建了一份任务。

页面上的状态也从“已提交”切到了“排队中”,再慢慢变成“生成中”。

我看着日志一路往下滚,心里刚冒出一点“这回应该稳了”的念头,伟源就把并发量往上提了。

十个批次。

二十个批次。

更多任务同时挤进模型调用入口。

前几条还在正常返回,后面突然开始连续超时。模型服务的失败记录一条接一条冒出来,有的是响应太慢,有的是直接被限频。前端页面倒没卡死,只是列表里很快铺开一片失败状态。

小马哥看着那片红色,叹了口气。

“前门是通了,后院躺了一地。”

我盯着模型调用记录,没说话。

前面为了让接口快,我们把任务全塞进了异步队列。这个方向没错,可队列只解决了用户不用站在页面上等,不代表模型服务突然就有了无限处理能力。我们这边把压力接住,再一股脑往下游倒,等于自己没被撞倒,转身把合作方撞墙上了。

伟源在第二轮用例后面又打了个叉。

“高并发下失败率超预期,状态不可接受。”

第二次提测,还是没过。

这次我心里那口气明显沉了一截。

第一次失败还能安慰自己是边缘场景没考虑全,第二次再被打回来,就已经不能拿“第一次做企业端”给自己找台阶了。测试环境不会因为你团队刚组起来,就自动开启新手保护。

我下意识想直接给失败请求加重试。

手刚放到键盘上,又停住了。

现在下游已经扛不住,再让所有失败请求原地重来一次,只会把压力翻倍。那不叫重试,叫带着兄弟们二次冲锋,争取一起死得更整齐。

我们重新围着调用链路过了一遍。

这一次先加的不是重试,是限流。

模型调用统一从一个入口出去,控制同时执行的数量;同一个企业短时间提交太多任务,也不能把其他企业的队列全部挤掉。超过阈值的任务继续排队,不直接冲模型。小马哥负责把排队状态和前端轮询节奏重新对齐,伟源补不同并发量下的用例,我盯着模型入口把日志和指标补齐。

忙到傍晚,窗外的光一点点暗下去,会议室里的灯却一直没关。

大家说话越来越少。

不是关系变差了,是每个人的电量都快从绿色掉到红色,连互相损两句都得先评估资源够不够。


第三轮提测是在晚上九点多。

限流生效以后,并发任务没再一窝蜂撞向模型。前面的任务一批批生成,后面的老实待在队列里,页面状态也没乱。

这一次,我们看着进度跑到快结束,谁都没提前说“稳了”。

前两次已经把这种话的风险等级教得很明白了。

伟源等正常流程跑完,没急着点通过。他打开测试环境里提前准备好的异常开关,让其中一条模型请求在返回前主动超时。

那条任务停了几秒。

随后,状态直接变成了“生成失败”。

没有再试。

也没有任何补偿动作。

伟源把电脑转向我。

“模型偶发超时是正常风险。如果一次超时就让客户重新提交整批任务,这版不能提。”

我知道他说得对。

可看到第三个叉落下来的时候,我脑子还是一下堵住了。

不是有很多想法挤在一起的堵。

是什么都不想动的那种堵。

我盯着那条失败记录,手放在键盘上,半天没敲出一个字。会议室空调还在响,小马哥在旁边翻接口记录,伟源低头补测试备注,可那些声音像突然离我很远。

连续三次提测失败。

每次都不是系统彻底崩了,偏偏都是那种你修完一层,下一层才肯露出来的问题。它不一拳把你打倒,只负责每隔几个小时提醒你一次:还差得远。

我心里甚至冒出一个很熟悉的念头。

要不让他们先回去,我自己把这一块收掉算了。

这念头刚出来,我就想起前面一个人扛项目的日子,也想起我们好不容易才把角色分清。真让所有人走了,今晚也许能安静一点,可团队刚建立起来的协作方式,又会被我亲手回滚成单机版。

我把手从键盘上拿开,站起来去外面接了杯水。

回来以后,我没说“问题不大”,也没说“我来搞定”。

我只说了一句:

“先停十分钟,重新拆。”

小马哥抬头看我。

伟源也把笔放下了。

我在白板上重新写了三块。

哪些错误可以重试。
哪些错误重试也没用。
重试以后,怎么保证不多出一份结果。

超时、临时不可用这类问题,可以有限次重试;参数错误、权限错误和明确的业务拒绝,重试十次也只是在浪费大家感情。所有重试必须重新回到限流队列,不能绕过入口直接撞模型;同一条任务沿用同一个请求标识,模型就算晚回来一次,也不能把结果落两遍。

小马哥接走了状态处理,去确认“系统重试中”和最终失败在页面上怎么呈现。

伟源把超时、重复回调和重试耗尽三条场景重新排好。

我负责把重试次数、间隔和结果幂等收进后端链路里。

那一刻我才从刚才那种阻塞里慢慢退出来。

压力没少。

问题也没有因为我们重新分了工就自动消失。

但至少我没有再把整个团队锁在“只有阿雷能修”的错误逻辑里。


晚上十一点四十七分,我们开始了第四轮。

提交接口正常返回。

重复请求没有创建新批次。

并发任务按限流规则进入队列。

那条被故意制造出来的超时请求,在间隔一段时间后重新进入调用队列,第二次拿到了模型结果。页面从“系统重试中”变成“生成成功”,列表里只有一份结果。

伟源又测了一条参数错误。

系统没有傻乎乎重试,直接返回了明确的失败原因。

他来回检查了两遍,终于把测试用例合上。

“这版可以提。”

就五个字。

我听完以后,后背一下靠进椅子里,才发现自己肩膀酸得厉害。小马哥在旁边长出一口气,抬手跟我碰了下拳。

“恭喜雷总,喜提测试环境居住权。”

我笑得没什么力气。

“这只是提测通过,不是项目上线。”

“我知道。”他说,“但人总得先为活过今天庆祝一下。”

我们没真庆祝。

三个人把桌上的咖啡杯收了收,又把今天的问题补进复盘文档。提交接口不能等待模型结果,锁只能保护关键落库区间,限流要同时考虑整体容量和单个企业占用,重试必须区分错误类型,还得跟幂等和状态展示一起设计。

写到最后,我又补了一条:

提测前不能只验证功能能不能跑,还要提前验证系统在慢、重复、拥挤和失败时会怎么活。

这一天最累的地方,不是写了多少代码。

是我们第一次发现,企业级项目的压力不会等到客户出现才来。它会先躲在测试环境里,把每一个你以为“应该没事”的边缘场景都翻出来,让你提前看看自己的系统到底有几斤几两。

好在这一次,扛住它的也不再只有我一个人。

我把复盘文档发进群里,又给小璇发了句:“通过了,准备回家。”

没过几秒,手机亮了。

她发来一个笑脸表情。

“你们团队熬夜比我画设计稿还猛。”

文章配图