Создание повторяющихся событий в nodejs для обновления или вставки таблицы MySQL

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

  1. События MySQL
  2. Kue, bull, повестки дня (библиотеки планирования node.js)
  3. Использование задания cron для ежедневного мониторинга задач

повторяющиеся задачи будут повторяться в течение недели, дня, месяца и года. Мы должны поставить возможность удалить повторяющееся событие в любое время. Что было бы хорошим и чистым решением?

2 ответа

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

Если вы вряд ли измените время выполнения задания (ежедневно, еженедельно, ежемесячно, ежегодно). Каждая задача будет иметь следующие поля last_run_date а также next_run_date, Каждый раз, когда запускается задача, я обновляю эти поля и создаю запись в таблице журнала, такую ​​как task_run_log который также будет хранить дату / время запуска задачи.

Затем я получу задание cron, которое запускает HTTP-сообщение для службы nodejs. Этот веб-сервис просматривал таблицу задач, находил, какие задачи необходимо выполнить в этот день, и отправлял сообщение для каждой задачи в какую-то очередь (AWS SQS, GCP Pub/Sub, Apache Kafka и т. Д.). Каждое сообщение в очереди будет представлять собой отдельную задачу, которую необходимо выполнить, работники могут подписаться на эту очередь и обработать задачу самостоятельно. После того, как работник обработал задание, он сделал бы запись в журнале и обновил бы last_run_date а также next_run_date поля. Если задача завершается неудачей, она добавляет ее для перемещения этого сообщения в очередь ошибок и регистрирует невыполненную задачу в журнале задач.

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

Вы также можете настроить оповещения в зависимости от того, выполняется задание cron или нет, чтобы убедиться, что процесс запущен правильно.

Мне нужно было сделать что-то очень похожее, вы можете использовать модуль npm для узла-расписания

Планировщик узлов имеет множество функций. Вы можете сначала создать свою настройку правила, которая определяет, когда она запускается, а затем планирует задание, в котором определяется, что задание выполняет, и активирует его. Ниже приведен пример из моего кода, который устанавливает задание для запуска в полночь каждый день.

 var rule = new schedule.RecurrenceRule();
 rule.dayOfWeek = [0, new schedule.Range(1, 6)];
   var j = schedule.scheduleJob(rule, function(){
     sqlUpdate(server);
 });

Это может не совсем соответствовать всем вашим требованиям в одиночку, но есть другие функции и настройки, которые вы можете сделать.

Например, вы можете отменить любую работу с помощью функции отмены

j.cancel()

Вы также можете установить время начала и окончания, как показано на странице npm.

let startTime = new Date(Date.now() + 5000);
let endTime = new Date(startTime.getTime() + 5000);
var j = schedule.scheduleJob({ start: startTime, end: endTime, rule: '*/1 * * * * *' }, function(){
  console.log('Time for tea!');
});

Есть также другие варианты для планирования даты и времени, так как это также соответствует формату cron. Это означает, что вы можете установить динамическое время

var j = schedule.scheduleJob('42 * * * *', function(){
  console.log();
});

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

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

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

Другие вопросы по тегам