Какое количество пользователей отслеживало приложение в вашем проекте?

«Какое количество пользователей отслеживало приложение в вашем проекте?» — вопрос из категории Софт-скиллы, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый пример ответа, который можно адаптировать под свой опыт.

Ответ

В моем последнем коммерческом проекте — платформе для онлайн-ивентов на Node.js — мы отслеживали активных пользователей в реальном времени. Пиковая нагрузка во время крупных трансляций достигала ~50 000 одновременных подключений через WebSocket.

Для подсчета и хранения этой метрики мы использовали комбинацию Redis (для скорости) и PostgreSQL (для персистентности и аналитики).

Пример реализации счетчика активных пользователей на Node.js с Socket.io и Redis:

const { createClient } = require('redis');
const { Server } = require('socket.io');

const redisClient = createClient();
await redisClient.connect();

const io = new Server(server);

io.on('connection', async (socket) => {
  const userId = socket.handshake.auth.userId;
  // Добавляем пользователя в Redis Set с ключом, имеющим TTL (например, на 5 минут)
  await redisClient.sAdd('active_users:session', userId);
  await redisClient.expire('active_users:session', 300);

  // Получаем и эмитируем общее количество
  const count = await redisClient.sCard('active_users:session');
  io.emit('activeUsersCount', count);

  socket.on('disconnect', async () => {
    await redisClient.sRem('active_users:session', userId);
    const newCount = await redisClient.sCard('active_users:session');
    io.emit('activeUsersCount', newCount);
  });
});

// Эндпоинт для получения текущего количества
app.get('/metrics/active-users', async (req, res) => {
  const count = await redisClient.sCard('active_users:session');
  res.json({ activeUsers: count });
});

Итоговые цифры по DAU/MAU мы агрегировали в PostgreSQL и визуализировали в Grafana, подключенной к этой БД.