Длинный запрос возвращается с пустым ответом через 120 секунд, вызванным Network Load Balancer - PullRequest
0 голосов
/ 28 февраля 2019

У меня кластер GKE с 2 узлами, со службой типа LoadBalancer.Когда я звоню в сервис изнутри, длительный запрос не истекает через 120 секунд.Но если я вызываю внешний IP-адрес Network Load Balancer, который перенаправляет во внутреннюю службу, я получаю ответ «Пустой ответ от сервера».

Пример внешнего вызова:

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
/ # 

Я пытался найти документацию для запроса или тайм-аута сокета на уровне балансировки нагрузки, но ничего не обнаружил.Есть идеи?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Получите имя бэкэнда балансировщика нагрузки с помощью:

gcloud compute backend-services list

, затем

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

в противном случае в консоли: Network services ⇒ Load balancing ⇒ Backends, затем вы можете щелкнуть свой HTTP-бэкэнд (ы)и отредактируйте настройки, включая тайм-аут.

На более широкой ноте это может быть один из скачков сервировки между сервером и клиентом, каждый из которых может быть тайм-аут.Вам лучше либо жить с тайм-аутом (и завершать длинные опросы до истечения тайм-аута), либо выполнять непрерывную подачу данных по линии ... например, вы можете предварительно отрендировать пробелы в json, поэтому, например, отправьте space персонаж каждые 30 секунд, пока у вас не будет правильного тела ответа.Это удержит баланс нагрузки от истечения времени ожидания.

0 голосов
/ 28 февраля 2019

Вы уверены, что это не тайм-аут на стороне клиента?Сетевой LB не обрабатывает пакеты, кроме как для их маршрутизации, поэтому он никогда не должен отправлять ответ обратно.

Попробуйте флаг -m свернуть?

Также возможно перехватите tcpdump на вашемна стороне клиента, чтобы вы могли видеть, что на самом деле делает сеть.

...