Как отправлять сообщения в Slack каждые «x» часов?

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

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

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

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

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

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

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

Обновлено:

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

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
698
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

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

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

Ответ принят как подходящий

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

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

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

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

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

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

Спасибо за отзыв! Я пошел с очень похожим подходом, основанным на этом ответе.

user2573690 18.05.2019 22:24

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