Ответ
Реализовывал двустороннюю связь в реальном времени для таких функций, как live-чат, уведомления, совместное редактирование и мониторинг дашбордов.
Backend (Node.js):
- Использовал библиотеку
wsдля создания легковесных серверов иSocket.IOдля проектов, требующих fallback-механизмов (long-polling) и комнат. - Интегрировал WebSocket-серверы с основным REST API, используя общую аутентификацию (например, JWT при handshake).
- Для масштабирования горизонтально использовал адаптеры (Redis Adapter для Socket.IO) или брокеры сообщений (Redis Pub/Sub).
Пример обработки соединения и сообщений с ws:
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', (ws, request) => {
// Аутентификация по токену из query-параметров
const token = new URL(request.url, 'http://localhost').searchParams.get('token');
if (!isValidToken(token)) {
ws.close(1008, 'Unauthorized');
return;
}
ws.on('message', (data) => {
try {
const message = JSON.parse(data);
// Бизнес-логика и broadcast
wss.clients.forEach(client => {
if (client !== ws && client.readyState === WebSocket.OPEN) {
client.send(JSON.stringify({ type: 'chat', payload: message }));
}
});
} catch (e) {
ws.send(JSON.stringify({ type: 'error', message: 'Invalid JSON' }));
}
});
ws.on('close', () => {
// Логика очистки
});
});
Frontend: Управлял состоянием соединения, реализовывал автоматический reconnect с экспоненциальной задержкой, обрабатывал буферизацию сообщений при разрыве. Также сталкивался с оптимизацией производительности при большом количестве соединений и отладкой с помощью инструментов разработчика Chrome (вкладка Network -> WS).