用 requests 流式读自建网关的 SSE,iter_lines 取到 data 后直接 json.loads,大约每两百条就有一次 JSONDecodeError: Unterminated string starting at,重试同一请求不一定复现。

一开始怀疑是「代码按 chunk 而不是按行解析事件」,查了一圈,方向不对。

原因不止一个,得分开看。一个事件被 TCP 拆成多个 chunk,行还没收全就解析。也可能是中间代理把两行合并,粘在了同一行里。

另外,响应缺空行分隔,事件边界丢失。

第一件事是改成按行累积再解析,不按 chunk

python sse_client.py --mode line

只在空行时提交一个完整事件

python sse_client.py --delimiter blank

再往下打印原始字节确认分隔符

curl -sN http://10.0.0.8:8000/stream | head -c 2048

剩下的就是用大输出请求压一百次复现

python sse_client.py --repeat 100

中间停过一次,把已经改的东西回滚干净,再重新来一遍。

改完先别撤,确认这几项。一百次请求零解析失败,事件条数与服务端日志一致,长回答不再被截成半句。

提醒一点。SSE 的事件边界是空行不是换行,任何按 chunk 直接 loads 的写法都会在长回答上翻车。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189