【发布时间】:2016-07-31 17:49:31
【问题描述】:
场景如下:
- 有一个 http 反向代理,它有一个与应用程序服务器的持久连接池。它收到了来自客户端的请求,并在检查连接是否打开后向后端发出相同的请求
- 同时,服务器在收到请求之前关闭连接,代理失败,从后端读取错误。
- 向客户端发送错误。
应该如何处理这种竞争条件: - 所有连接关闭都应该由代理启动,而不是由后端服务器启动? - 由于连接关闭而无法发送时,代理应该重试请求吗?
【问题讨论】:
场景如下:
应该如何处理这种竞争条件: - 所有连接关闭都应该由代理启动,而不是由后端服务器启动? - 由于连接关闭而无法发送时,代理应该重试请求吗?
【问题讨论】:
代理只是通过流量。如果服务器已经关闭了连接,代理也应该立即关闭它,即使有一个未决的请求。 但是,从客户端站点来看,所描述的情况看起来像服务器没有为请求返回任何数据。这应该通过“keep-alive”握手来防止。
在 HTTP 协议中,标题“Connection:”用于这种情况。如果客户端希望在处理请求后保持 TCP 会话打开,则包括“连接:保持活动”(因此可以在同一个 TCP 会话中发送下一个 HTTP 请求)。服务器仍然可以回复“Connection: Close”标头,这意味着 TCP 会话无论如何都会关闭。
【讨论】: