Очередь электронной почты и SMS в NodeJS

Я разрабатываю приложение node.js. В моем приложении мне нужно отправлять массовые электронные письма и SMS пользователям, удовлетворяющим определенным критериям. Я использую Gmail SMTP для электронной почты и стороннего поставщика для SMS. Я предполагаю, что запуск API для служб электронной почты и смс в цикле опасен. Как правильно это сделать?


person Jaseem Abbas    schedule 21.06.2015    source источник
comment
Почему вы думаете, что это опасно?   -  person Andrey    schedule 21.06.2015
comment
Я слышал страшные истории о том, что электронные письма и SMS не доставляются. Просто хотел подтвердить, прежде чем запускать его в производство.   -  person Jaseem Abbas    schedule 21.06.2015
comment
Это зависит от многих вещей, главное - какие именно услуги вы используете. Невозможно ответить на ваш вопрос, как это выглядит сейчас.   -  person Andrey    schedule 21.06.2015
comment
Вся идея заключается в том, что когда API отправляет данные, электронная почта и смс должны быть отправлены примерно 50 000 – 1 миллиону пользователей. Однако API не нужно ждать отправки уведомлений. При успешной отправке данных возвращается истинный ответ. В настоящее время я работаю на небольшом экземпляре AWS с MySQL RDS. (Сервера будут масштабироваться по мере увеличения пользовательской базы)   -  person Jaseem Abbas    schedule 21.06.2015
comment
Вам следует использовать специальный сервис, такой как Mailgun или SendGrid для электронной почты (у них есть плагины NodeMailer) и что-то подобное для SMS, которое гарантирует, что вы сможете обрабатывать массовые очереди.   -  person laggingreflex    schedule 21.06.2015


Ответы (1)


Затраченное время, очевидно, пропорционально N, являющемуся размером N вашего набора. Чем больше у вас пользователей, тем больше времени требуется. Имейте в виду, что запросы по сети не блокируются ни в коем случае.

В любом случае, если N не рискует быть тысячами или миллионами элементов, вы можете сделать это в цикле и прикрепить правильный обратный вызов для обработки ответов/ошибок.

В противном случае вы можете отправить электронное письмо/смс и запланировать ту же операцию для следующего элемента, используя nextTick (дополнительную информацию см. в документации по nodejs). Таким образом, вы распределите все действия по нескольким итерациям цикла событий.

person skypjack    schedule 21.06.2015
comment
Я написал API, который отправляет данные. При возникновении этого события пользователям отправляются массовые электронные письма и смс-сообщения. Однако API вернет ответ до того, как электронные письма и смс будут полностью отправлены. Электронные письма и SMS являются просто электронными письмами с подтверждением и не подвергают пользователей риску. Как вы думаете, я все еще могу продолжить эту реализацию? - person Jaseem Abbas; 21.06.2015
comment
Я предполагаю, что объект ответа, который вы получаете, является объектом, который генерирует такие события, как data или error, не так ли? Если это так, прикрепите пару слушателей к этим событиям, потому что вы входите в асинхронный мир, тогда вы можете свободно продолжать, поскольку эти операции не блокируют. - person skypjack; 21.06.2015
comment
Я видел, как люди отслеживали статус отправленных электронных писем и смс и запускали задание крона, чтобы убедиться, что уведомления доставлены. На мой взгляд, это дополнительная нагрузка на сервер. Запустить задание крона через миллион пользователей — не шутка. Вот что меня смутило. - person Jaseem Abbas; 21.06.2015
comment
Итак, определите размер вашего набора. Когда вы начинаете отправлять почту, вы перебираете миллионы пользователей? Какой именно процесс вы ожидаете? Вы читаете данные и сохраняете ответ в БД? Нам нужно больше подробностей о проблеме и ожиданиях, чтобы дать вам больше информации о возможном решении. - person skypjack; 21.06.2015
comment
Как мобильный пользователь, я создаю запрос на услугу, вызывая API создания запроса в бэкэнде. У меня есть набор поставщиков услуг, которые зарегистрированы в приложении. Поставщики услуг, подпадающие под определенные критерии для обслуживания запроса, получают уведомления по электронной почте и смс. В настоящее время у меня 50 000 поставщиков услуг. - person Jaseem Abbas; 21.06.2015
comment
Как определяется объект ответа, который вы получаете? Возвращает ли он данные посредством асинхронного слоя (например, с помощью событий)? Это довольно сложно, не зная, какую библиотеку вы используете, определение API и так далее. - person skypjack; 21.06.2015