在某些情况下,我无法从 HTTP 请求接收到对特定服务的响应:请求是通过负载平衡器发送的,并且响应太大而无法放入单个数据包中。在这些条件下,永远不会收到响应。两者都不是错误。服务器发送一个 TCP ACK 来响应包含 HTTP 请求的数据包,但之后什么都没有。连接只是挂起等待发生的事情。无论请求是通过 CURL、节点的 HTTP 库还是 Postman 发送的,都会观察到该行为。
什么可能导致这种行为?如何调试导致问题的原因?
- 我已经验证负载均衡器后面的服务正在接收并响应 HTTP 请求,但是响应在某处丢失了。
- 我们还有其他类似设置的服务不会出现此问题。
- 我们尝试设置负载均衡器的不同实例,但它有同样的问题。
在服务器上的 tshark 中,[TCP Retransmission]
在它通过负载均衡器接收到一个有问题的请求后,我看到了一些条目(当直接接收到相同的请求时不会发生这种情况)。这似乎表明客户端和服务器之间的某些东西误导了 TCP 流量(高度暗示负载平衡器),但我不明白只有当 HTTP 响应被拆分为多个数据包时才会导致这种情况发生,并且只有这个特定的服务。
导致失败的条件:
直接的 | 负载均衡器 | |
---|---|---|
单包 | ✅ | ✅ |
多个数据包 | ✅ | ? |
网络拓扑结构:
Client -> Load Balancer -> Service