Вопрос проверяет понимание асинхронности и способов разгрузки основного потока при отправке аналитических событий, что критично для отзывчивости приложений.
Аналитика — это побочный процесс: пользователю не важно, когда именно уйдёт событие, важно, чтобы интерфейс оставался быстрым. Если отправлять события синхронно в основном потоке, каждый сетевой запрос будет блокировать выполнение JavaScript или обработку запроса на сервере. Поэтому аналитику выносят в отдельный поток, очередь или сервис.
const queue = [];
function track(event) {
queue.push(event);
if (queue.length >= 10) flush();
}
function flush() {
const batch = queue.splice(0);
navigator.sendBeacon('/analytics', JSON.stringify(batch));
}
setInterval(flush, 5000);На бэкенде синхронная запись в аналитическое хранилище тоже блокирует обработку запроса. Решение — писать событие в очередь (Kafka, RabbitMQ, Redis Streams), а отдельный воркер разбирает её и сохраняет в БД. Так основной запрос отвечает быстро, а аналитика обрабатывается асинхронно.
// Node.js + BullMQ
await analyticsQueue.add('event', { userId, action });
// HTTP-ответ уходит сразу, воркер обработает позжеВыносить аналитику стоит всегда, когда её отправка не влияет на бизнес-результат запроса. Это повышает отзывчивость, снижает риск потери событий при пиках и позволяет масштабировать обработку независимо от основного приложения.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию