Задать вопрос
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 просмотров
Подписаться 3 Оценить Комментировать
Ответ пользователя Артемий К ответам на вопрос (2)
MetaAbstract
@MetaAbstract
Архитектор информационных систем и баз данных. Ful
Используйте между клиентом и сервером очередь сообщений. Таким образом Вы развяжете архитектурно клиент и воркеров и сможете регулировать нагрузку на систему. Для очереди сообщений лучше готовое решение взять, хотя можно и самому запилить.
Есть еще более продвинутые системы обработки потоков данных например в Hadoop.
Ответ написан