создание повторяющихся событий в nodejs для обновления или вставки таблицы MySQL - PullRequest
0 голосов
/ 09 февраля 2019

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

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

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

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

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

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

 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 будетздесь есть смысл, и после запуска код может быстро вытянуть и перезапустить все созданные задачи на основе данных из базы данных.А когда вы отменяете работу, вы просто удаляете ее из базы данных.Следует отметить, что процесс должен быть включен, чтобы задание работало, задание не будет запущено, если процесс выключен

0 голосов
/ 12 февраля 2019

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

Если вы вряд ли измените параметры времени задания (ежедневно, еженедельно, ежемесячно, ежегодно).Каждое задание будет иметь следующие поля 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 илине чтобы убедиться, что процесс запущен должным образом.

...