OpenShift部署的Server Side Events接口返回HTTP 504超时该如何配置?
你提供的SSE接口代码本身没有问题,本地运行正常就说明业务逻辑是通的,HTTP 504属于网关超时错误,SSE作为长连接流式接口,会被OpenShift默认的网关规则主动中断长时间没有数据交互的连接,普通REST接口因为请求响应速度快所以不受影响,需要调整以下几类配置:
- 调整OpenShift Route的超时时间
OpenShift默认使用HAProxy作为路由网关,默认HTTP请求超时时间为30秒,远小于SSE长连接的常用连接时长。给对应服务的Route添加以下注解即可自定义超时:haproxy.router.openshift.io/timeout: 24h
时间单位支持s(秒)、m(分钟)、h(小时),可以根据业务实际需要调整。 - 禁用HAProxy响应缓冲
HAProxy默认会缓冲后端服务返回的响应内容,SSE需要逐帧实时返回数据,缓冲开启时会导致数据被攒存,无法及时返回给客户端触发超时。给Route添加以下注解关闭缓冲:haproxy.router.openshift.io/disable-buffer: "true" - 调整Service Mesh超时规则(如果集群部署了Istio/OpenShift Service Mesh)
如果你集群启用了Service Mesh能力,默认Istio的请求超时为15秒,需要修改对应服务的VirtualService配置,将timeout字段调整为预期的长连接时长,同时关闭重试规则避免SSE请求被重复提交。 - 调整外部负载均衡超时(如果集群前有外层LB)
如果你在OpenShift集群前面还部署了F5、Nginx等外部负载均衡,需要同步调整外部LB的空闲连接超时时间,保证该时长大于等于OpenShift Route设置的超时时间,避免连接被外层LB提前中断。
除此之外也可以在业务代码里定期发送SSE心跳帧(比如间隔10秒发送:keepalive\n\n的空注释帧),不需要把超时时间设得过长也能维持连接稳定。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

