У меня есть страница конфигурации, на которой пользователь может выбрать, в какое время получать определенную информацию из моего API, например, он может выбрать получение информации каждый день в 17:00 или каждую пятницу в 17:00. После того, как это установлено, пользователь должен получать сообщение Slack в указанное время, например, каждый день в 17:00 он будет получать сообщение...
Я сохраняю часовой пояс пользователя, чтобы я мог отправить ему сообщение в Slack в нужное для него время.
При этом, как я могу запланировать отправку этого сообщения из моего приложения node.js? У меня было бы несколько пользователей в системе, и все они, вероятно, выбрали бы разное время, поэтому мне нужен таймер для каждого пользователя?
Единственное, о чем я могу думать, это сканировать всех пользователей в системе, получать выбранное ими время и затем отправлять им сообщение... но это не кажется масштабируемым.
Я не ищу полного решения для этого, просто несколько советов о том, как разработать такую функциональность.
Я также просмотрел запланированные сообщения Slack, но это не совсем то, что я ищу. Примечание: я уже могу отправлять сообщения в Slack, меня больше интересует, как построить механизм таймера.
Заранее спасибо!
Провел небольшое исследование, и похоже, что node-schedule может быть вариантом для планирования заданий: https://github.com/node-schedule/node-schedule#readme
Используя этот пакет, я сканирую всех пользователей в своей базе данных, скажем, в полночь каждый день и планирую задания на основе их настроек... затем эти задания выполняются в запланированное время, и пользователь получает сообщение в Slack. Хороший ли это подход?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это штатная задача? Другими словами, он выполняется каждый день в одно и то же время для пользователя X? Если это так, node-schedule выглядит нормально, и он может регулярно запускать одно и то же задание, вам просто нужно правильно настроить его с помощью строки, похожей на cron (см. инструкции в README). Если пользователь изменит свои настройки, вы измените предыдущее задание. Недостатком node-schedule является то, что вам нужно настраивать его каждый раз при загрузке вашего приложения, что может занять некоторое время и потреблять много ресурсов, если у вас слишком много пользователей.
В качестве альтернативы, если количество пользователей велико или вы предпочитаете, чтобы ваше приложение не сохраняло состояние, вы можете установить количество слотов для отправки этих сообщений (и запустить это в отдельном процессе от вашего основного приложения). Скажем, слот каждые 30 мин. Затем вы устанавливаете таймеры для этих временных интервалов (используя node-schedule, если хотите, это будет всего 48 таймеров), извлекаете список пользователей для этого временного интервала из базы данных и отправляете сообщения.
В целом, NodeJS/JavaScript довольно эффективен с такого рода планированием на основе таймера. Если вы хотите более подробно разобраться в причинах, см. это: https://nodejs.org/de/docs/guides/event-loop-timers-and-nexttick/
Вам также необходимо учитывать, что произойдет, если ваше приложение перестанет работать. Должны ли пользователи гарантировать получение этих сообщений, даже если они опаздывают? Но это уже другая история :-)
Для основной логики я бы предложил что-то вроде этого:
Такой подход устойчив к простоям. Он просто возобновит отправку должных сообщений, как только рабочий процесс снова запустится после простоя.
Он также масштабируем: при необходимости вы можете запускать несколько рабочих процессов (убедитесь, что ваши рабочие процессы поддерживают параллельную обработку, например, с транзакциями).
Некоторые дополнительные вещи, которые следует учитывать:
Спасибо за отзыв! Я пошел с очень похожим подходом, основанным на этом ответе.