Есть сайт на 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 секунды.
И в третьих время ожидания ответа от сайта или сервера может затянуться, если вдруг какой-то сервер ляжет.
Буду благодарен за подсказку) В гугле не знаю как правильно сформировать вопрос.