Zimapovoh
@Zimapovoh
Yii2

Как синхронизировать сайт с воркер-сервером?

Есть сайт на PHP+MySQL. На этом сайте пользователи создают задачи, а затем запускают их.
Задача - это выполнение определённых действий. Среднее время выполнения задачи 5-6 часов.

При запуске задачи запускается воркер (Gearman) в фоновом режиме и затем на этот воркер вешается клиент.
Происходит это так:

exec("php task/run/test.php > /dev/null &");

$client = new GearmanClient();
$client->addServer();
$client->doBackground('test', json_encode($data));


Одновременно запущенных задач может быть большое количество (от 1к).
При выполнении задачи постоянно пишутся данные в БД.

Стал вопрос, что будет если действительно запустить около 1к воркеров на одном сервере с сайтом? Как я понимаю будет висеть 1000 PHP процессов и 1000 соединений с БД. Это крах!!!

Хочу сервер с сайтом отделить от воркеров. Думаю сделать так.
Сайт на одном сервере, Gearman со своими воркерами на втором сервере.
Но не знаю как правильно взаимодействовать с БД сайта, ведь там нужно постоянно следить за статусом задачи (запущена/остановлена) и обновлять данные которые генерирует воркер.

Вижу вариант взаимодействия между сайтом и сервером с воркерами через API. Например юзер запускает задачу, отправляем GET/POST запрос на сервер с германом.
На сервере запускается воркер, а на сайте создаётся Gearman клиент, который подключается к выше созданному воркеру.

Воркер начинает свою работу и при выполнении определённых действий отправляет POST/GET на сайт, передавая нужные данные, которые затем пишутся в БД и выводятся на сайте.
Но мне кажется это костыль!

Во-первых сервера с воркерами могут одновременно отправить ~1000 запросов на сайт, который я думаю может лечь (может ошибаюсь).
Во-вторых нужно в realtime следить за статусом задачи на воркерах. Например юзер нажал стоп и воркер должен моментально остановиться, сейчас я храню статус задачи в кеше, воркер юзает этот кеш каждые 1-2 секунды.
И в третьих время ожидания ответа от сайта или сервера может затянуться, если вдруг какой-то сервер ляжет.

Буду благодарен за подсказку) В гугле не знаю как правильно сформировать вопрос.
  • Вопрос задан
  • 470 просмотров
Пригласить эксперта
Ответы на вопрос 2
@MechanID
Админ хостинг провайдера
я никоим образом не разработчик но возможно вам помогут такие инструменты.
1 если много записей в базу а чтений на порядок меньше то посмотрите на движок TokuDB от Percona
2 также можно построить архитектуру вокруг брокера сообщения например rabbitmq в нем будут очередя для разных вещей - новые задачи с саайта идут в чередь оттуда их забирает скрипт и запускает воркеров который выполняют задачу, состояние задач и резльтаты воркеры могут тоже класть в другие очередя, а оттуда их уже забирать на сайт в базу или еще куда. Зачем это вобще нужно ? - Очередя задач и данных это буфер который позволяет размазать нагрузку во времени. Например результаты пишутся не напрямую в базу а сначала в очередь, а на сервере базы воркер читает очередь и кладет данные в базу при этом мониторя нагрузку на базу и недопуская оверлоада.
Ответ написан
MetaAbstract
@MetaAbstract
Архитектор информационных систем и баз данных. Ful
Используйте между клиентом и сервером очередь сообщений. Таким образом Вы развяжете архитектурно клиент и воркеров и сможете регулировать нагрузку на систему. Для очереди сообщений лучше готовое решение взять, хотя можно и самому запилить.
Есть еще более продвинутые системы обработки потоков данных например в Hadoop.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы