Какие способы реализации RealTime взаимодействия знаешь?

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

Ответ

При разработке realtime-приложений на Node.js я использовал следующие технологии:

1. WebSockets (основной выбор): Протокол полнодуплексной связи поверх TCP. Для работы с ним в Node.js чаще всего использую библиотеку ws для низкоуровневого контроля или Socket.IO для более богатой функциональности.

  • Пример с Socket.IO (с комнатами и пространствами имён):
    // Сервер (server.js)
    const io = require('socket.io')(3000);
    io.on('connection', (socket) => {
      console.log('Клиент подключился');
      socket.join('room-123'); // Вход в комнату
      socket.to('room-123').emit('user-joined', socket.id); // Широковещание в комнату
      socket.on('chat-message', (msg) => {
        io.to('room-123').emit('new-message', { user: socket.id, text: msg });
      });
    });

2. Server-Sent Events (SSE): Простой протокол для односторонней потоковой передачи данных от сервера к клиенту по HTTP. Идеален для live-дашбордов или уведомлений.

    // Серверный endpoint в Express.js
    app.get('/events', (req, res) => {
      res.setHeader('Content-Type', 'text/event-stream');
      const interval = setInterval(() => {
        res.write(`data: ${JSON.stringify({ time: Date.now() })}nn`);
      }, 1000);
      req.on('close', () => clearInterval(interval));
    });

3. Long Polling: Стратегия, при которой клиент делает запрос, а сервер держит его открытым до появления новых данных. Часто используется как fallback для Socket.IO. В чистом виде сейчас применяется редко из-за накладных расходов на HTTP-заголовки.

Почему WebSockets/Socket.IO? В моих проектах Socket.IO был оптимальным выбором для чатов или collaborative features, потому что он:

  • Автоматически предоставляет механизм повторного подключения.
  • Поддерживает комнаты и пространства имён для логической группировки клиентов.
  • Может автоматически понижать до long polling, если WebSockets заблокированы (например, некоторыми прокси).