Ответ
В моем последнем коммерческом проекте — платформе для онлайн-ивентов на 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, подключенной к этой БД.