Кажется, что задача элементарная.
Берём список из 100 000 email-адресов.
Пишем:
for (user of users) { sendEmail(user) }
Готово? Не совсем. 😄
Если отправить письма всем сразу, можно случайно устроить себе очень плохой день.
Во-первых, большинство почтовых сервисов имеют ограничения на скорость отправки. Если за секунду попытаться отправить тысячи писем, сервер может решить, что вы спамер, и временно заблокировать отправку.
Во-вторых, отправка письма — это не мгновенная операция. Пока сервер устанавливает соединение, передаёт данные и ждёт ответ, поток может зависнуть. Если таких операций тысячи одновременно, приложение начнёт съедать память и тормозить.
Именно поэтому крупные сервисы используют очереди задач.
Когда пользователь нажимает кнопку «Отправить рассылку», письма не улетают сразу. Они попадают в очередь, а специальные воркеры спокойно отправляют их небольшими партиями: например, по 20–100 писем одновременно, следят за ошибками, делают повторные попытки и не перегружают сервер.
Получается сразу несколько плюсов:
🔹 приложение не зависает
🔹 сервер не получает огромную нагрузку
🔹 письма реже попадают в спам
🔹 если что-то пошло не так — рассылку можно продолжить, а не начинать заново
Поэтому в реальных проектах массовая отправка писем — это уже не цикл, а отдельная система со своими очередями, лимитами и логикой обработки.
Именно такие, на первый взгляд, «простые» задачи чаще всего оказываются гораздо сложнее, чем кажется. 😄
💬 А как думаете, какая ещё задача выглядит на пять строк кода, а на практике превращается в отдельный сервис?