@vladimirStrgnv

Как отслеживать время у объектов в базе данных?

С моего фронтенда приходят объекты с информацией на моей сервер, в одном из свойств которых хранится определенная дата, по наступлению которой я должен достать информацию об объекте из базы данных и произвести с ней некое действие на стороне другого сервиса.
Например :
В базу данных сегодня пришел объект с датой 26.11.2022 17.30. Мне нужно 26.11.2022 в 17.30 обратиться в базу данных и достать этот обьект. Как сделать это правильно?
Затруднение заключается в способе мониторинга и сопоставления даты.
Есть 2 идеи. Первая идея это создать на стороне моего сервера, куда приходят объекты и затем отправляются в базу данных , что-то на подобии setInterval функции и делать каждые 5-10 секунд запрос в базу данных , сверяя время у всех объектов с текущей датой, что скорее всего не очень правильное решение. Второй вариант это при помощи node-cron условно каждый день в 00.00 проходится по коллекции обьектов в базе данных и если у объекта стоит сегодняшняя дата, то создавать функцию setTimeout на стороне сервера с необходимой датой срабатывания, куда я буду передавать необходимую логику по взаимодействию с другим сервером
  • Вопрос задан
  • 190 просмотров
Решения вопроса 3
ThunderCat
@ThunderCat Куратор тега JavaScript
{PHP, MySql, HTML, JS, CSS} developer
Средствами ноды или перечисленными в ответах способами сделать можно, но это не эффективно, обычно для такого используют менеджеры очередей, типа RabbitMQ и ему подобные.
Ответ написан
Комментировать
node-schedule
При запуске сервиса просто взводите все джобы, которые у вас есть в базе. Если их очень много, группируйте по времени срабатывания. Ну или можно действительно делать выборку только за сегодняшний день, каждые несколько часов, нужно подобрать параметры в зависимости от задачи и нагрузки.

Или вот ещё планировщик есть: Bree
Ответ написан
Комментировать
Aetae
@Aetae Куратор тега JavaScript
Тлен
Никаких setTimeout точно.
spoiler
Во-первых: setTimeout ничего не гарантирует, кроме того что он не сработает раньше указанного интервала(зато может гораздо позже).
Во-вторых: это абсолютно ненадёжно, т.к. любой перезапуск и всё пропало.
В-третьих: это очень жирно по ресурсам.

Просто при каждом поступающем сообщении создаёте задачу на временную метку(можно с помощью совета Станислав Макаров) если такой ещё нет, которая в указанное время запросит все записи с такой меткой и выполнит с ними нужное действие.
Метку и, соответственно, запрос можно создавать с округлением в размере допуска.
В базе естественно всё это дело надо индексировать и складывать для удобства таких запросов.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы