Распределение Нагрузки При Парсинге Сайтов И Подключении Дополнительных Облачных Ресурсов

В этом посте речь пойдет о библиотеке, которая регистрирует ноды внутри себя и перенаправляет запросы извне на конкретную ноду.



Как возникла идея написать этот проект?

После того, как возникла необходимость парсить сайты в больших количествах, я попробовал реализовать такую штуку с помощью селеновой сетки, тогда взял селеноид. подошёл selenoid, но там было много того, что мне не нужно, типа версий и опций браузера, и самое главное отсутствие автомасштабирования (но selenoid нужен не для этого).

90% времени кластер простаивает, а затем появляется большая нагрузка, с которой сервер не справляется.

Это приводит к большим затратам на оборудование, которое практически постоянно не работает, да и не справляется.

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

К счастью, это можно реализовать, например, через АВС EC2 .



Немного о структуре

  • Центр.

    Хаб запускается там, где вам удобно; он нужен в одном экземпляре.

    При создании докер-контейнера с хабом вам необходимо передать ему переменную среды.

    жетон .

    После чего он начинает ждать входящие соединения от узлов и пользователей.

    Хаб запоминает маршруты, помнит их ровно одну минуту.

    В бою , затем удаляет этот маршрут и освобождает узел для другого клиента.

  • Морской узел.

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

    При создании докер-контейнера с узлом вам необходимо передать ему переменную среды.

    жетон И сервер .

    Сервер — это IP нашего хаба.



Вариант №1. Запрос с узла

Узел отправляет запрос хабу с установленным заголовком.

жетон - это токен из переменной среды.

Хаб проверяет токен из запроса и, если они совпадают, запоминает его.

Хаб начинает пинговать этот узел каждые 4 секунды.

Если 5 попыток ping не увенчались успехом, узел удаляется с отметкой о потере соединения.

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

Это сделано для того, чтобы после потери соединения кластер сам восстанавливал свое состояние.



Вариант №2. Запрос от пользователя

Пользователь делает запрос к хабу с заданными заголовками жетон И число .

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

Каждая сессия имеет свой уникальный номер.

По каждому запросу хаб проверяет, есть ли уже созданный маршрут или нет; если есть, запрос просто перенаправляется на нужный узел; если такого маршрута нет, запрос пользователя ставится в очередь на освобождение узла.

Как только один из узлов освобождается, хаб создает маршрут для пользовательской сессии и освобожденный маршрут. Теперь все запросы к этой сессии будут идти на конкретный узел.

Минуту спустя.

когда пользователь закрывает соединение, узел освобождается и передается другому запросу пользователя.

Ссылка на репозиторий проекта

Нижняя граница

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



P.S. Некоторые разъяснения

Это первый проект, который я начал писать на GOLANG, поэтому если у кого-то есть предложения или замечания, пишите в комментариях (даже на пиар не рассчитываю, но было бы супер круто!) Теги: #golang #phantomjs #docker #тестирование ИТ-систем #программирование
Вместе с данным постом часто просматривают: