Перенос заданий cron в nodejs при перезапуске сервера - PullRequest
0 голосов
/ 28 мая 2020

У меня есть приложение node js, в котором пользователь может запланировать 4-5 различных заданий cron. Пользователь выбирает start_date, end_date, start_time и end_time, и, соответственно, функции cron планируются, и создаются некоторые кампании для связи с потенциальными клиентами (или другими пользователями). Я использую npm package node-schedule для достижения желаемого выполнения задания cron, но проблема возникает, если мое веб-приложение вылетает между ними.

Согласно официальной документации node-schedule,

Обратите внимание, что Node Schedule разработан для внутрипроцессного планирования, т.е. запланированные задания будут запускаться только до тех пор, пока выполняется ваш скрипт. , и расписание исчезнет, ​​когда выполнение завершится.

Решение, которое я могу решить, - это вызвать функции cron с помощью файла server. js, который перезапускается каждый раз при выполнении сценария сервера . Но я не могу решить некоторые из следующих проблем:

  1. Планировщик - это отдельная функция, а не специфическая для кампании c, поэтому как приложение узнает, какую cron-функцию запускать, если она не был завершен?
  2. Планировщик - это отдельная функция, которая будет вызываться каждый раз при перезапуске сервера. Если создано 6 экземпляров сервера, он будет вызываться 6 раз.

Предположим, мой планировщик должен выполняться с 11:00 28 мая до 12:00 31 мая. Планировщик начинает свою работу, и некоторые кампании выполняются между ними. Если мой сервер выйдет из строя 30 мая, как я могу выбрать оставшиеся даты и время и кампании и завершить их оттуда?

Поэтому меня беспокоит, как запланировать или обработать функции задания cron для кампании? Если какое-либо из заданий cron кампании выйдет из строя, если сервер остановлен, как я могу изменить расписание или выполнить эту функцию cron с оставшегося времени или даты?

I Я не очень разбираюсь в cron-задачах, надеюсь на какие-нибудь удобные решения.

1 Ответ

2 голосов
/ 02 июня 2020

Вот несколько советов, которые вы могли бы просмотреть или реализовать в зависимости от возможностей вашего оборудования:

Разделение

Разделите ваше текущее приложение на два отдельных артефакта: веб и кампанию. Это позволяет развертывать, перестраивать, повторно развертывать и управлять каждой службой независимо. А также иметь автономные или универсальные команды.

источник: https://skelia.com/articles/5-major-benefits-microservice-architecture/

Отказоустойчивость

Если вам нужно приложение, которое не t влияет на сбой, cra sh или любое событие, требующее перезапуска, вы должны использовать что-то за пределами вашего приложения.

Обычно это за пределами - это база данных . Вы можете использовать файл json, если база данных вам не подходит.

Campaign

У нас здесь две сущности:

campaign_configurations

| identifier | desc | cron_expression | |-------------------|----------------|-----------------| | month_discounts | discounts ... | 0 0 1 * * | | reminder_shop_car | a reminder ... | */10 * * * * | | | | | Также вы можете добавить столбец для контроля срока действия cron с датой начала и окончания.

campaign_executions

| execution_date | execution_status | execution_log | |---------------------|------------------|---------------| | 10-10-2020 01:00:00 | finished | ... | | 10-10-2020 14:30:00 | error | ... | | 10-10-2020 14:35:00 | executing | ... |

Запуск приложения

Когда ваша nodejs кампания запускается / перезапускается из-за сбоя или запланированного обслуживания, это должен быть поток:

  • чтение таблицы campaign_configurations и получить все выражения cron за допустимый период.
  • используйте алгоритм, чтобы определить, нужно ли сегодня выполнять ваши выражения cron. Пример:
    • cron только в декабре (Рождество) не должен запускаться сегодня: 3 июня
    • cron каждые 5 минут, должен выполняться в следующие 5 минут
  • Каждое выполнение в начале должно создавать запись в таблице campaign_executions со статусом: pending
  • Каждое выполнение может использовать node-schedule для выполнения logi c.
  • Новые исполнения не должны выполняться, если предыдущее выполнение находится в состоянии ожидания или в состоянии ошибки. Согласно вашей внутренней бизнес-логике c.

Приложение исправно

Когда приложение исправно, оно должно запросить таблицу campaign_configurations для выполнения новые или измененные выражения cron (объясненный ранее поток)

Это может происходить каждые 30 минут, чаще и реже, в соответствии с вашим внутренним бизнес-логом c.

Вы можете использовать node-schedule для этой задачи.

...