场景如下:
- 有一个 http 反向代理,它有一个与应用程序服务器的持久连接池。它已经收到来自客户端的请求,并在检查连接是否打开后向后端发出相同的请求
- 与此同时,服务器在收到请求之前关闭了连接,代理因从后端读取错误而失败。
- 向客户端发送错误。
应该如何处理这种竞争条件: - 所有连接关闭都应该由代理发起而不是由后端服务器发起? - 由于连接关闭而导致发送失败时,代理应该重试请求吗?
最佳答案
代理只是通过流量。如果服务器关闭了连接,proxy 也应该立即关闭它,即使有请求未决。 但是,从客户端站点所描述的情况来看,服务器似乎没有为请求返回任何数据。这应该通过“保持事件”握手来防止。
在 HTTP 协议(protocol)中, header “Connection:”用于这种情况。如果客户端希望在处理请求后保持 TCP session 打开(因此可以在同一个 TCP session 中发送下一个 HTTP 请求),则客户端包括“Connection: Keep-Alive”。服务器仍可能回复“Connection: Close” header ,这意味着 TCP session 无论如何都会关闭。
关于apache - HTTP KeepAlive 连接被服务器关闭但客户端同时发送了一个请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38686828/