记录一下那天晚上的排查过程。Cloudflare Workers 里用 TransformStream 改写上游 SSE,wrangler dev 正常,部署后最后一条 data 和 DONE 没到浏览器,wrangler tail 里看不到 flush 里的日志。
刚开始盯着「压缩设置把尾部小包攒住」,折腾了半个多小时,排掉了。
把日志和配置对完,能解释这个现象的基本就这几处。flush 里没有把残留 buffer 发出去。也可能是worker 提前 return,没有 await writer.close。
不容易想到的是,CPU 时间超限,流被平台切断。
动手时先在 transform 的 flush 里补发残留内容
python -c "print('enqueue tail in flush')"
随后确认 close 前所有 write 都已 await
npx wrangler tail --format pretty
接着对该路由关闭压缩后复测尾块
curl -N --compressed https://demo.workers.dev/stream
剩下的就是用 tail 观察是否出现 CPU 超限告警
npx wrangler tail --status error
改之前我把相关日志按时间截了一段存着,事后对时间线用得上。
别只看报错消失,验证要多做一步。浏览器端能收到最后一条 data 和 DONE,tail 日志里 flush 分支有输出,连续请求 20 次都没有缺尾。
提醒一点。Workers 的流式实现里 flush 很容易被忽略,本地 dev 用的是另一套运行时,只有部署后才暴露,写完 transform 一定要在线上抓一次完整事件序列。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
