Сервер получает веб-запросы спустя долгое время после удаления из LoadBalancer - PullRequest
0 голосов
/ 07 ноября 2019

У меня возникла следующая проблема в системе, которую я поддерживал ~ 7 лет назад. Мы никогда не доходили до сути, и акцент сместился на другие вопросы. Мне недавно напомнили об этом, и я удивился, узнает ли кто-нибудь, что происходит. Но, увы, я буду немного не в деталях. Извините.


Настройка

У меня была ферма веб-серверов, стоящая за балансировщиком нагрузки. На серверах размещалась система, которая получала бы HTTP-запросы (XML и / или SOAP) от клиентов, а затем каждый из них отправлял несколько дополнительных HTTP-запросов сторонним поставщикам, ожидал ответов поставщиков, обрабатывал иобъединить результаты и ответить на запрос клиента.

Подумайте о сравнении страхования, но как об услуге XML Business-To-Business.

Вся обработка займет 5 секунд с момента получения исходного клиентазапросить их отправку ответа на этот исходный HTTP-запрос, и сервер будет обрабатывать 10 или 100 запросов параллельно (т. е. в любой заданный момент веб-сервер будет иметь много клиентских запросов, которые поступили и были зарегистрированы);но еще не было получено ответа.)

У нас было подробное ведение журнала, в котором записывается получение запросов, включая исходный IP-адрес и какой сервер обрабатывал запрос, и записывается, когда был отправлен ответ.

Все клиентские запросы были отправлены на один IP-адрес (ну, URL),это был адрес loadbalancer, который затем отправлял запросы веб-серверам, которые не были индивидуально доступны для Интернета (у них не было общедоступных IP-адресов).

Наш балансировщик нагрузки позволил бы намвывести отдельные веб-серверы из ротации для обслуживания. Когда мы это сделали, мы могли наблюдать журналы БД и видеть, что новые запросы перестают поступать, а существующий запрос постепенно завершается, пока не осталось невыполненных запросов и сервер не работал.


Проблема

Мы обнаружили, что иногда, когда мы выводим сервер из ротации ... он не прекращает полностью получать запросы. Вы могли видеть, что большая часть запроса внезапно перестала поступать, но он все равно получал бы струйку свежих запросов (я не знаю ... возможно, 0,1% от нормальной загрузки, может быть, меньше?). Я думаю, что самое длинное, что мы оставили, это может быть ... 10 минут?

Примечательно, что мы поняли, что все эти запросы поступали с одного клиента / IP-адреса (я не помню, какой именно). Я забыл, получали ли другие (все еще вращающиеся) веб-серверы запросы от этого клиента, но я думаю они были?

Если мы перезагрузим веб-сервер, дальнейшие запросы не будут поступатьпосле перезапуска.

Веб-стек был Windows, IIS, ASP.NET;довольно старая школа даже в то время. Все серверы принадлежат и настроены индивидуально.


Что происходит?

Мы смутно махали руками и утверждали, что интеграция клиента с нами "держала HTTPтуннель открыт и отправляет несколько запросов через него ", а не отправляет каждый запрос отдельно, и, таким образом, поддерживает этот туннель даже после того, как LB прекратил отправлять новые запросы на этот сервер. Но это было BS-waffle, и так как нам никогда не нужно было на самом деле понимать, что происходит, мы игнорировали это и шли дальше своей жизнью:)

Но я все равно хотел бы знать, что мы видим,если кто-то может диагностировать это из этого описания.

1 Ответ

1 голос
/ 07 ноября 2019

Мы смутно махали руками и утверждали, что интеграция клиента с нами состояла в том, чтобы «держать открытый туннель HTTP и отправлять через него несколько запросов», а не отправлять каждый запрос отдельно, и, таким образом, поддерживал этот туннель даже послеLB прекратил отправлять новые запросы на этот сервер.

Звучит как хорошее объяснение.

Как правило, LB откажется от новых подключений к удаленному серверу, но позволит открытым подключениям оставаться в живых, пока они не закроются естественным образом. Это известно как «истощение соединения» или «постепенное отключение».

Если у одного из ваших клиентов была включена поддержка активности HTTP, и он удерживал TCP-соединение открытым и отправлял через него HTTP-запросы в течение длительного времени, этоукажите симптомы, которые вы описываете.

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

Поведение клиентов по обработке HTTP-соединений будет изменяться по усмотрению клиента в значительной степени. Возможно, большинство ваших клиентов относились к одному типу (скажем, веб-браузеры) и не держали открытым одно соединение в течение 10 минут, но, возможно, один клиент отличался (скажем, программный клиент HTTP API)?

Дополнительную информацию о «разгрузке соединения» в балансировщиках нагрузки AWS можно найти здесь (точные подробности зависят от поставщика LB): https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/config-conn-drain.html

Дополнительная информация о HTTP сохраняется здесь: https://en.wikipedia.org/wiki/HTTP_persistent_connection

...