Как запустить функцию на основе времени, которое хранится в моей БД?

У меня есть API бронирования, который создает сеансы в моей БД с одним из столбцов, запланированным временем регистрации. Мне нужна функция, которая автоматически проверяет пользователя на основе запланированного времени регистрации. Как мне это сделать? Единственное решение, которое я могу придумать, — это запуск планировщика заданий на основе времени каждую минуту, который проверяет всех пользователей, запланированных на эту минуту. Есть ли лучший способ добиться этого?


person saket agarwal    schedule 13.11.2018    source источник
comment
Какая это БД? Исходный код function?   -  person michaeak    schedule 13.11.2018
comment
Что вы пытались вызвать function и в чем ваши ошибки?   -  person michaeak    schedule 13.11.2018
comment
какую технологию использует API бронирования?   -  person michaeak    schedule 13.11.2018
comment
@michaeak DB — это MySQL, а API написан на Java. Ошибок нет, еще не реализовал. Я хотел убедиться, что планировщик подходит для этого.   -  person saket agarwal    schedule 13.11.2018


Ответы (1)


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

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

Таким образом, лучшая идея состоит в том, чтобы выполнить все еще не обработанные элементы с заданным временем возврата, как только задание будет запущено. Такой безопасно встанет на ноги в случае каких-то происшествий.


Однако, если вы хотите выполнение на основе событий, т. е. не запускать задание до тех пор, пока элемент не будет готов к обработке, вам обязательно понадобится какой-то демон, работающий в фоновом режиме, который планирует задачи по готовности. Некоторые базы данных имеют встроенные планировщики, которые могут выполнять эту работу. Команда Unix at также может выполнить эту работу. (Учитывайте проблемы с часовым поясом.)

Итак, если у вас есть какой-то демон, который может выполнять задание в заданное время, вам нужно накормить этого демона. Каждый раз, когда обновление базы данных приводит к изменению времени следующей регистрации, вам необходимо настроить время запуска следующего задания. Для этой цели можно использовать триггер базы данных. Но вам нужно знать об условиях гонки, потому что одновременные обновления могут запускаться параллельно. Вам также необходимо позаботиться о потерянных запусках из-за неожиданного сбоя системы или по какой-либо другой причине. т.е. требуется определенный вид мониторинга.

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


Вывод

Если нет веских причин не делать этого, циклическое запланированное задание, которое проверяет работу, является простым и надежным решением.

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

person Marcel    schedule 13.11.2018