Как отправить сообщение Slack каждые 'x' часов? - PullRequest
0 голосов
/ 12 мая 2019

У меня есть страница конфигурации, на которой пользователь может выбрать, в какое время получать определенную информацию из моего API, например, он может получать информацию каждый день в 17:00 или каждую пятницу в 17:00.После того, как это установлено, пользователь должен получать сообщение Slack во время, которое он определил, например, каждый день в 5 вечера они будут получать сообщение ...

Я сохраняю часовой пояс пользователя, чтобы я мог отправитьсообщение им в Slack в правильное для них время.

При этом, как я могу запланировать отправку этого сообщения из моего приложения node.js?У меня будет несколько пользователей в системе, и все они, вероятно, выберут разное время, поэтому мне понадобится таймер для каждого пользователя?

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

Я не ищу полного решения для этого, просто несколько советов о том, как разработать такую ​​функциональность.

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

Заранее спасибо!

РЕДАКТИРОВАТЬ:

Сделал немногобольше исследований, и похоже, что узел-расписание может быть вариантом для планирования заданий: https://github.com/node-schedule/node-schedule#readme

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

Ответы [ 2 ]

1 голос
/ 12 мая 2019

Для основной логики я бы предложил что-то вроде этого:

  • Сохраните время доставки (например, 5 часов утра в пятницу) для каждого пользователя в вашей базе данных
  • Затем укажитерабочий процесс, который выполняется на регулярной основе, например, каждые 5 минут
  • При запуске он проверяет, есть ли какие-либо сообщения, подлежащие доставке
  • Если да, он отправляет сообщение с информацией об APIпользователю и сохранить последнее время отправки для пользователя

Этот подход устойчив к простоям.Он просто возобновит отправку должных сообщений, как только рабочий процесс снова запустится после простоя.

Это также масштабируемо: при необходимости вы можете запускать несколько рабочих процессов (убедитесь, что ваши рабочие поддерживают параллельную обработку, например, с транзакциями)

Некоторые дополнительные моменты, которые следует учитывать:

  • Ограничило бы количество сообщений, отправляемых за один прогон, чтобы избежать тайм-аутов и слишком большого числа работающих параллельно людей
  • Вам потребуется некоторая обработка ошибок, если отправка сообщения в Slack не удалась
  • КомуВо избежание сложностей с часовыми поясами, я бы посоветовал преобразовать все тайминги в UTC для обработки в вашем приложении
1 голос
/ 12 мая 2019

Это обычное задание?Другими словами, он выполняется каждый день в одно и то же время для пользователя X?Если это так, node-schedule кажется нормальным, и он может регулярно выполнять одно и то же задание, вам просто нужно правильно настроить его с помощью cron-подобной строки (см. Инструкции в README).Если пользователь изменяет свои настройки, вы затем изменяете предыдущее задание.Недостатком node-schedule является то, что вам нужно устанавливать его каждый раз при загрузке приложения, что может занять некоторое время и потреблять много ресурсов, если у вас слишком много пользователей.

В качестве альтернативы, если количество пользователейимеет большой размер или вы предпочитаете, чтобы ваше приложение оставалось без состояния, вы можете установить количество слотов для отправки этих сообщений (и запустить их в отдельном процессе от вашего основного приложения).Допустим, слот каждые 30 мин.Затем вы устанавливаете таймеры для этих временных интервалов (если хотите, используйте node-schedule, это будет всего 48 таймеров), извлекаете список пользователей для этого временного интервала из базы данных и отправляете сообщения.

В целомNodeJS / JavaScript довольно эффективен с такого рода расписанием по таймеру.Если вы хотите глубже погрузиться в причины, посмотрите это: https://nodejs.org/de/docs/guides/event-loop-timers-and-nexttick/

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

...