You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python应用(Cloud Run&VM)Redis事件后WebSocket无法发送完成消息

Cloud Run部署的Python Web应用中,视频后处理完成后WebSocket无法推送complete: true消息

问题背景

我开发了一个处理视频文件的Python Web应用,部署在Cloud Run上,使用VM执行视频预处理与后处理流程。应用通过Redis传递消息,WebSocket向客户端推送处理状态更新:

  • 预处理阶段:Redis消息发布正常,WebSocket能正常发送状态消息
  • 后处理阶段:视频处理已成功完成,但WebSocket无法推送complete: true消息,导致用户卡在处理页面
  • 仅在部署环境出现该问题,本地无法复现,且偶尔会随机恢复正常

已排查内容

  • Redis配置、连接与消息传递均正常
  • 添加全流程日志,显示后处理已成功完成,但无complete: true消息的发送日志
  • 应用其他模块的WebSocket通信功能正常

流程概述

  1. 应用向Redis频道发布预处理消息(正常)
  2. 记录WebSocket消息标识后处理开始(正常)
  3. 应用向Redis频道发布后处理开始消息(正常)
  4. 后处理成功完成,但未发送complete: true的WebSocket消息(异常)

可能的解决方案

1. 检查WebSocket连接的生命周期与Cloud Run限制

Cloud Run的实例有请求超时和自动缩容机制,可能导致WebSocket连接提前断开:

  • Cloud Run默认HTTP请求超时为900秒,若后处理耗时超过该值,连接会被强制关闭
  • 实例空闲时会自动缩容,持有WebSocket连接的实例可能被销毁
  • 解决措施:
    • 将WebSocket状态推送改为客户端轮询Redis/Firestore的处理状态,解耦长连接依赖
    • 调整Cloud Run的超时时间(最大可设为3600秒),同时配置最小实例数避免缩容

2. 优化Redis消息订阅的可靠性

Redis频道订阅属于广播模式,无持久化机制,若订阅端短暂断连会丢失消息:

  • 可能WebSocket服务的Redis订阅客户端未实现自动重连逻辑,错过后处理完成的消息
  • 解决措施:
    • 为Redis订阅客户端添加重连逻辑,断开后自动重新订阅频道
    • 改用Redis Stream替代频道订阅,Stream支持消息持久化和消费确认,确保消息不丢失

3. 校验后处理完成的消息触发逻辑

可能后处理完成的信号未正确触达WebSocket服务:

  • VM后处理完成后发布的Redis消息格式不符合预期,导致WebSocket服务未识别
  • WebSocket服务的消息监听逻辑存在分支遗漏,未执行发送complete: true的代码
  • 解决措施:
    • 在VM的后处理完成代码中,添加消息内容的日志打印,确认格式正确
    • 在WebSocket服务的消息监听部分,打印所有收到的Redis消息,检查是否有后处理完成的消息被接收但未处理

4. 排查Cloud Run的资源与网络限制

Cloud Run实例资源不足或网络规则限制可能阻塞WebSocket消息发送:

  • 实例CPU/内存不足,导致消息发送线程被阻塞
  • VPC防火墙规则限制了WebSocket的出站流量
  • 解决措施:
    • 提升Cloud Run实例的CPU和内存配置
    • 检查VPC防火墙规则,确保允许80/443端口的出站流量(WebSocket默认使用这些端口)

5. 添加WebSocket连接心跳检测

客户端WebSocket连接可能已断开,但服务端未检测到,导致消息发送失败无报错:

  • 解决措施:
    • 在服务端实现心跳机制,定期向客户端发送心跳消息,检测连接存活状态
    • 发送complete: true消息前,先检查WebSocket连接状态,确认正常后再发送

内容的提问来源于stack exchange,提问作者Peaceful Climber

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 21:18:24