预估四十刀的生图功能,账单出来一百八十六

周末给自己那个小应用加了个文生图。估的是四十刀,账单一百八十六。

不是哪张图特别贵,翻了单价,没有。往回捋才看明白:客户端等超时了,前端提示失败,用户回头又手动把表单交了一遍;与此同时我的 worker 也在自己重试。一次点击,实际落到模型上的是好几次。而我面板上看着一切正常:我从头到尾只统计成功的请求,尝试次数一次都没记。钱按尝试算,数按成功算,差出来的就是那一百多。

改法是按顺序来的。先把幂等键从 worker 挪到 web 入口生成,一路带着穿过所有重试——键得在最外层生成才有意义,搁里层的话每重试一次就是个新键,等于没做。接着,发字节之前先落一条 attempt 记录,不管最后成没成;有了它,成本才第一次变成能查的东西,而不是月底对账时的一个总数。再在队列前面加个每用户的尝试上限。上限替代不了账单告警,它管不住单价,但能把一个失控的循环变成看得见、有边界的事故。

挑接口的标准也顺手改了,就两条:能不能自己给自己讲清楚一次请求的完整生命周期,能不能证明哪个请求产出了哪张图。临时 URL 只当交接用,字节必须自己抄进存储。

契约测试现在固定三个 fixture:完成态、pending,还有一个格式坏掉的 200。最后这个抓到的集成 bug 比正常路径多多了——状态码说没事、body 里却是一堆问号,这种情况没人当回事。

离谱

超时重试翻倍这个我也中过,排查半天才发现网关自己还带了一层重试

1 个赞

谢佬

坏掉的 200 那个 fixture 我抄走了,之前确实只测了 happy path

4 个赞

拿临时 URL 当数据库记录,见过好几个项目在这翻车 :sweat_smile:

8 个赞

重试之前先查一下有没有已经出好的图,幂等键补上能省一半钱

网关那层最阴,日志里看着只调了一次,账单上躺着三条