已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
背景
我是前端,我们有一个典型的聚合型 BFF 接口 /api/home/feed:一次请求内部 fan-out 到 4 个下游(用户画像、内容推荐、活动位、AB 配置),单接口 SLO 是 1.2s。按 P99 口径给下游切的预算是 600/500/300/200ms,理论余量 200ms——但实际线上 P99 里下游偶发打到 900ms+,留给「合并 + 序列化 + 响应头」的余量经常掉到 50~80ms,也就是说BFF 侧的超时经常「贴着」1.2s 边界打。
前端侧 timeout 也配的 1.2s(和 BFF 同值,没做 +ε)。结果就是:有一小撮请求,BFF 内部其实跑完了(甚至部分下游已经写库成功),但响应没在前端 timeout 前送达,前端看到的是 net::ERR_TIMED_OUT。
现象
已尝试的排查与结果
Idempotency-Key 重试:解决了重复领取,但 BFF 侧没有实现「幂等键 → 结果缓存」的通用层,只是业务侧各自 if 判断,覆盖不全。X-Request-Status 头 + 客户端轮询 /api/request-status/{id}:方案评审被否了——聚合接口是纯读的,「查状态」比「等结果」成本高,且前端要维护一个「在途请求表」,复杂度不值。期望得到的答案形态
欢迎贴具体的配置、日志样例、对账 SQL——细节越多越能对上。