Cloud Run使用keep alive header时多请求是否固定路由至同一实例
Cloud Run分片上传方案可行性解答
首先解答你关于HTTP/2头部的疑问:Chrome开发者工具显示HTTP/2头部代表当前请求实际使用HTTP/2协议传输,和服务端是否兼容HTTP/1无关,你提到的站点实际同时支持HTTP/1和HTTP/2,浏览器默认优先选择更高版本的协议,所以才会显示HTTP/2请求头。
接下来是你关心的核心问题的结论:
- 默认情况下,Cloud Run没有开启会话粘滞,负载均衡不会保证同一客户端的多个请求路由到同一个实例。
- 不过Cloud Run的负载均衡是基于连接分发请求的:如果你所有分片请求都复用同一个HTTP/2连接,那这些同连接的请求一定会被路由到同一个Cloud Run实例,只要总上传耗时不超过你配置的Cloud Run超时时间上限,服务端的ByteReader逻辑可以正常运行,这个方案在连接不中断的前提下是可行的。
- 需要注意的是,Chrome的HTTP/2连接复用不是完全可靠的:网络波动、Chrome主动回收闲置连接、中间代理断开连接都会导致新建连接,新连接的请求会被路由到其他实例,导致你的服务端逻辑失败。
如果需要更稳定的上传方案,建议做以下改造:
- 服务端改成无状态分片上传逻辑:每个分片请求携带唯一上传会话ID、分片序号、总分片数,分片数据暂时存入云存储而非实例内存,所有实例均可读取同一个会话的分片数据,全部分片上传完成后再拼接成完整文件,该方案完全适配Cloud Run的无状态架构,不受实例路由规则影响,稳定性更高。
- 如果必须保留单实例内存处理的逻辑,你可以手动开启Cloud Run的会话粘滞功能,开启后同一客户端的请求会尽量路由到同一个实例,仅当目标实例过载或被销毁时才会分发到其他实例,可大幅降低跨实例请求的概率。
内容的提问来源于stack exchange,提问作者Dean Hiller
相关产品推荐
相关产品推荐

