@alnecha

события для данных в базе, какие есть способы?

Есть таблица с задачами, у каждой задачи есть время выполнения допустим 30.09.11 14:50 дата в юникстайм, как следить за этим датами и за 5 минут до начала задачи отправлять уведомление?

пока знаю только одно решение с бесконечным циклом и sql запросом
выполнение по крону

какие ещё варианты есть?

база данных mysql, языки php, python
  • Вопрос задан
  • 5486 просмотров
Решения вопроса 1
А кто добавляет задачи? Если внешний код — вообще красиво, добавляем в него и свой кусочек, и при делании чего-то с базой просто спрашиваем у БД, что там напланировано еще сделать, затем у at запрашиваем текущий список запланированного к выполнению, сравниваем полученные данные, и выдаем нужные команды, которые приведут список at-заданий к тому виду, как оно вам нужно.

И тогда получаем разделение — и mysql «дергается» (хотя, какое это дергание?) только по факту изменений в нем, и планированием занимается стандартная утилита (уж явно она это сделает не хуже самописного демона).

Ну а вот если событие «изменение базы» проходит тайно от нас, остается в цикле раз в минуту делать опрос (чаще не нужно, Вы же храните события с минутной точностью) и, если список в БД поменялся на фоне прошлого раза, опрашиваем at, и дальше по приведенному плану. Менее изящно, но вполне работоспособно.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 5
dali
@dali
как часто обновляется таблица с заданиями? после каждого обновления можно запускать php скрипт, который будет брать время заданий, отнимать 5 минут, писать в crontab задачи: время выполнения, послать на почту уведомление о задании. Если к кронтабу доступ не хотите давать, можно записывать в sh файл, а его подключить к крону.
Это если сразу так навскидку. Сейчас еще подумаю )
Ответ написан
@rPman
1. необходимо любым доступным способом отлавливать появление новых записей в базе (так или иначе это можно сделать либо в приложении, которое пополняет базу, либо тригером, совершающим действие 'снаружи', если ничего удачного БД не позволяет… периодически (в 2 раза чаще чем самый короткий интервал) делать максимально простой запрос — например текущее значение сиквенса в табличке
1. пишется демон (1 процесс), который должен ловить событие от появления записи в БД и вычислять время срабатывания ближайшего таймера (простейший запрос к табличке, сортировка по времени срабатывания таймера — лимит 1) и ждать либо срабатывания таймера либо следующего события добавления записи
Ответ написан
Комментировать
savostin
@savostin
Еще один программист
Запускайте по крону раз в минуту скрипт, который выбирает задачи на исполнение, отправляет уведомления и ставит флаг выполненности. Если что-то не сработает один раз всегда можно, хоть и с опозданием, выполнить при следующем запуске. Самое простое, надежное и не ресурсоемкое решение, имхо.

Демоны зависнут, отожрут память.
Писать в крон каждое задание — трудности и неточности редактирования (надо или переписывать все задачи, или искать по id, который туда, в cron, еще надо как-то добавить).

Есть еще один вариант, но он Вам вряд ли подойдет, т.к. Вы скорей всего уведомления на почту шлете?
Ответ написан
Мне в голову пришла извращеность, за которую не бейте сильно, но…
Написать процедурку с бессконечным цыклом и со СЛЕЕП() в нём + другая деятельность, которая Вам нужна…
+ и запрос куда-нибудь в базу данных, чтобы уничтожить цыкл… Например будет значение в какой-то конфиг таблице, работай бешенно: 1 или 0. Спускать такую функцию можно триггером после попытки зименения чего-там угодно… или просто селектом… Или как тунинг можно такую процедурку вызывать с каким-то параметром, например количество секунд и длительность…

Это был первый вариант.

Второй вариант это процедурка:
… вы что-то там делаете
СЛИП на нужное количество времени
… поспали? можно изващатся…
Ответ написан
Qwadrat
@Qwadrat
Тут именно не хочется дергать записи в таблицы каждую минуту, хочется чтобы они в пределе какого-то интервала в оперативной памяти хранились

Вам все правильно сказал, что такого в том, чтобы каждую минуту делать запрос к базе?
Если сильно не хочется запрашивать каждую минуту, выполняйте запрос каждые 5 минут и затем раз в минуту отправляйте уведомления.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы