Свой cron с проверкой в 3-5 сек

alexandr_kulik

Новичок
Поделитесь опытом, задача такая, есть таблица в SQL с заданиями по каждому пользователю в ней хранится время когда нужно выполнить задание на каком аккаунте и что выполнить, таких задания в таблице выходит очень много, подозреваю есть какой то хороший метод отличающийся от моего.
У меня сделано как, работает демон который каждые 3-5 секунд дергает с базы наступившие задания по времени, колонка с временем проиндексирована, и когда задача наступает берет данные с таблицы и повещает в очередь Gearman на выполнение, после того как повестил в очередь время выполнения увеличивает на +10 минут на тот случай если задача не выполнится или что то оборвется, а в очереди уже если задача выполняется успешно ставит отметку что задание выполнено и время ставит что и было ну и дальше уже данную задачу не трогает, если ошибка, то обрабатывает ошибку сдвинутое время оставляет что бы попробовать еще раз выполнить ну и счетчик ошибок увеличивает.
Вопрос как дергать данные на проверку есть что выполнять или нет, мне кажется что дергать постоянно базу как то не очень, но не могу придумать альтернативу, подскажите советом идеей
 

Valick

Новичок
Очень сумбурное описание. Непонятно от слова "нихрена". Это какая-то игра? Стратегия в реальном времени?
 

alexandr_kulik

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

alexandr_kulik

Новичок
Данные по заданиям хранятся в базе данных, их много может быть 50 -150 т. задач от всех пользователей
Через Js дергать с фронт можно, но мне не нужно он в демоне нормально дергает, только вопрос в том каждые 3-5 сек делать запрос к базе это не очень рационально
 

Valick

Новичок
берет данные с таблицы и повещает в очередь Gearman на выполнение, после того как повестил в очередь время выполнения увеличивает на +10 минут на тот случай если задача не выполнится или что то оборвется, а в очереди уже если задача выполняется успешно ставит отметку что задание выполнено и время ставит что и было
какой-то бесовской алгоритм
если вы пытаетесь сделать какой-то аналог youtrack, то могу вам только посочувствовать
лучше оставьте так как работает сейчас, единственное не вижу смысла дёргать БД через каждые 3-5 секунд
забрали из БД текущие задачи, узнали время ближайшей задачи и уложили демона спать до этого времени
если в БД добавлена новая задача, то придётся разбудить демона и так далее по кругу
 

alexandr_kulik

Новичок
а если в базу добавили новые задачи, то нужно данные уже обновить.
т.е. нужно мониторить что то что бы демон знал когда нужно обновить данные.
А так как Вы пишите взял данные с базы посмотрел что следующее задание например будет через 20 мину и спит, а в это время добавилось новая задача которая должна выполнится раньше, демон спит, и не увидет новую задачу которую нужно выполнить раньше
 

alexandr_kulik

Новичок
Ну что бы разбудить нужно узнать когда разбудить, демон значит должен мониторить
 

WMix

герр M:)ller
Партнер клуба
@alexandr_kulik есть скрипт типа
while(true) do(); который бесконечно крутится и проверяет на каждую итерацию
1. есть ли новАЯ задачА, если есть, помечаем задачу как "в обработке", запускаем параллельный процесс, и передаем ему задачу.
2. есть ли завершенные задачи, какой статус (ок/ошибка), и дальнейшие действия (перезапустить/информировать), можно реализовать как задачу

этот скрипт мониторится супервайзером, на случай если отвалится..

советую поглядеть React-подобнае архитектуры
 

alexandr_kulik

Новичок
@alexandr_kulik есть скрипт типа
while(true) do(); который бесконечно крутится и проверяет на каждую итерацию
1. есть ли новАЯ задачА, если есть, помечаем задачу как "в обработке", запускаем параллельный процесс, и передаем ему задачу.
2. есть ли завершенные задачи, какой статус (ок/ошибка), и дальнейшие действия (перезапустить/информировать), можно реализовать как задачу

этот скрипт мониторится супервайзером, на случай если отвалится..

советую поглядеть React-подобнае архитектуры
Так и сделано через supervisort мониторится что бы не упал демон, и если есть задачи то gearman ставлю в очередь на выполнени.
Цель вопроса в том что корректно ли дергать базу в цикле там каждые 3-5 сек что бы проверять есть ли новые задания на выполнения или нет
 

WMix

герр M:)ller
Партнер клуба
а ты сразу update запускай и проверяй affected rows если нет можно sleep
 

WMix

герр M:)ller
Партнер клуба
когда будет проблемой придется делить на 2 базы (очередь кстати лучше), тут уже врятли оптимальнее напишешь
 

WMix

герр M:)ller
Партнер клуба
выбора нет. сколько пользователей столько соединений, это же не беспокоит тебя
 

alexandr_kulik

Новичок
ну пользователь пришел сделал несколько запросов ушел, а демон то постоянно будет крутить 24/7 каждые 3-5 секунды, вот это беспокоит
 

alexandr_kulik

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

На ум только с оптимального такое приходит.
Брать данные с базы ну и смотреть когда нужно запустить ближайшую задачу, отсортировать по времени и спать пока не наступит время, но и проверять каждые 3-5 сек например файл-флаг по времени изменении, т.к. время изменения быстрее читает чем открывать файл и смотреть что в нем, и если файл менялся то заново с базы читать все задачи и строить график если нет, то ждем наступившее время ну по сути как @Valick предлагал.

Ну может есть еще какие то более изящней варианты
 
Сверху