2

我有一个带有 2 个节点的 GKE 集群,其服务类型为 LoadBalancer。当我在内部调用服务时,长请求不会在 120 秒后超时。但是,如果我调用转发到内部服务的网络负载均衡器的外部 IP,我会收到“来自服务器的空回复”响应。

外部调用示例:

curl -v "http://<public-ip>/longResponse"
*   Trying <public-ip>...
* TCP_NODELAY set
* Connected to <public-ip> (<public-ip>) port 80 (#0)
> GET /longResponse HTTP/1.1
> Host: <public-ip>
> User-Agent: curl/7.54.0
> Accept: */*
>
* Empty reply from server
* Connection #0 to host <public-ip> left intact
curl: (52) Empty reply from server

内部调用示例:

/ # wget -O - -S <service-name>/longResponse
Connecting to location-service (10.3.255.181:80)
  HTTP/1.1 200 OK
  Access-Control-Allow-Origin: *
  Content-Type: application/json
  Content-Length: 15
  Date: Thu, 28 Feb 2019 10:31:14 GMT
  Connection: close

-                    100% |*********************************************************************************************************************************************************************************************************************|    15  0:00:00 ETA
/ # 

我试图在负载均衡器级别查找请求或套接字超时的文档,但我没有遇到任何问题。任何想法?

谢谢。

4

2 回答 2

0

你确定这不是客户端超时吗?网络 LB 除了路由数据包之外不处理数据包,因此它不应该发回任何响应。

尝试将-m旗帜卷曲?

也可能在您的客户端捕获一个 tcpdump,这样您就可以看到网络实际在做什么。

于 2019-02-28T17:52:05.650 回答
0

使用以下命令获取负载均衡器的后端名称:

gcloud compute backend-services list

然后

BACKEND=name-of-your-backend
gcloud compute backend-services update $BACKEND --timeout=600s

否则,在控制台中:Network services ⇒ Load balancing ⇒ Backends然后您可以单击 HTTP 后端并编辑设置,包括超时。

从更广泛的角度来看,这可能是服务器和客户端之间的一个 serval 跃点,每个跃点都可能超时。你最好要么忍受超时(并在超时之前完成你的长轮询),要么滴下提供数据......例如,你可以在 json 中预先设置空格,例如,space每发送一个字符30 秒,直到你有一个适当的响应正文。这将防止负载平衡超时。

于 2019-02-28T18:14:49.323 回答