Для отправки почты это слишком простой процесс для разработчика: настроить почтовый сервер (SMTP), отправить запрос на SMTP-сервер и просто определить статус, успешный или неудачный.

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

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

Я впервые узнал об асинхронности, когда узнал о Node.js. до этого я понятия не имел об асинхронности. Как я знаю, Node.js действительно работает с однопоточным циклом обработки событий. Таким образом, вы не ждете выполнения задачи, которая не имеет отношения к вашему другому обратному вызову. Например, если вам нужно отправить 1 миллион писем, вы можете отправить сразу, потому что один получатель не зависит от другого. Я имею в виду, что у вас нет таких правил, как серийный пакетный процесс [email protected], затем [email protected] и так далее.

Ниже на диаграмме я описываю архитектуру.

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

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

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