Producer, queue, consumer: как выносить долгие задачи из HTTP-обработчика и не терять их.
Пользователь регистрируется. Обработчик должен: создать запись в БД (быстро) и отправить приветственное письмо (медленно — внешний SMTP, 2-5 секунд).
app.post('/register', async (req, res) => {
const user = await db.users.create(req.body); // 20 мс
await sendWelcomeEmail(user.email); // 3000 мс 😱
res.json({ ok: true }); // юзер ждал 3 секунды
});Пользователь смотрит на спиннер, пока мы разговариваем с почтовым сервером. А если SMTP лёг — регистрация падает целиком, хотя запись в БД создалась!
HTTP-обработчик обязан ответить быстро, но внутри запроса рождается работа, которой не нужно завершаться до ответа. Пользователю достаточно знать «принято, делаем» — как в кафе тебе дают номерок, а не заставляют стоять у кассы, пока готовится бургер. 🍔
Нужен способ отложить работу: записать «надо отправить письмо» куда-то, ответить пользователю, а письмом заняться отдельно. Это «куда-то» — очередь сообщений.
Почему отправку письма нельзя просто оставить в обработчике регистрации?