我已将 NodeJS API 部署到 IAP 后面的 Cloud Run 进行身份验证。我正在尝试将 SSE 发送到客户端,但它们都在缓冲,直到达到最大缓冲区长度或事件完成,然后再发送。
它在本地工作,事件立即发送。在部署的环境中,我可以看到 Cloud Run 日志显示 API 正在立即触发写入,但它们直到稍后才会批量到达。
我认为它与标头剥离或 GFE 或 IAP 中的某些内容有关,但我似乎无法立即发送事件。我添加了
"X-Accel-Buffering": "no"
但这没有帮助。
编辑 - Cloud Run HTTP/2 已禁用,因为它当前与 IAP 一起使用时会无限循环。我在文档中找不到任何内容表明 Cloud Run 需要 HTTP/2 用于 SSE。
这是部署线:
gcloud run deploy api-XXXX
--quiet
--image us-east4-docker.pkg.dev/hq-xxxxx/XXXX
--update-env-vars NODE_CONFIG_ENV=develop
--update-labels managed-by=github-actions,commit-sha=XXX
--platform managed
--format json
--region us-east4
--project XXXX
--no-cpu-throttling
API 返回的当前标头 - 我想我已经尝试了很多。
"Content-Type": "text/event-stream; charset=UTF-8",
"Cache-Control": "no-cache",
"Connection": "keep-alive",
"X-Accel-Buffering": "no",
大多数框架中 POST 的默认状态代码是 201。如果您提交正文并期望 SSE 响应,则应将状态代码修改为 200。 如果状态不是 200,Google Cloud Run 将缓冲整个响应。
总而言之:发送
text/event-stream
/ 服务器发送事件时,确保您的“成功”响应代码始终为 200。