← Назад к вопросам

В чем разница между Polling и Long Polling?

2.2 Middle🔥 171 комментариев
#Браузер и сетевые технологии

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

В чем разница между Polling и Long Polling

Polling и Long Polling — это два подхода для получения обновлений с сервера в реальном времени. Давайте разберемся, как они работают и чем отличаются.

Обычный Polling (Short Polling)

Как это работает

Клиент регулярно отправляет HTTP-запрос на сервер через фиксированные интервалы времени, независимо от того, есть ли новые данные или нет.

// Пример обычного polling
function startPolling() {
  setInterval(() => {
    fetch('/api/messages')
      .then(res => res.json())
      .then(data => {
        console.log('Новые сообщения:', data);
        updateUI(data);
      });
  }, 5000); // Запрос каждые 5 секунд
}

startPolling();

Характеристики

  • Интервал фиксированный: запросы отправляются каждые N секунд
  • Просто реализовать: просто используй setInterval
  • Много ненужных запросов: даже если нет данных, запрос идет
  • Задержка: если обновление приходит за 1 секунду после опроса, нужно ждать до 5 секунд

Пример жизненного цикла

Время: 0с   - отправили запрос (нет данных)
Время: 5с   - отправили запрос (новые сообщения!)
Время: 10с  - отправили запрос (нет данных)
Время: 15с  - отправили запрос (нет данных)
Время: 20с  - отправили запрос (новые сообщения!)

Long Polling

Как это работает

Клиент отправляет запрос на сервер, и сервер не отвечает сразу. Вместо этого сервер ждет, пока появятся новые данные, и только потом отправляет ответ. После получения ответа клиент сразу же отправляет следующий запрос.

// Пример long polling
function startLongPolling() {
  async function poll() {
    try {
      const response = await fetch('/api/messages/long-poll', {
        timeout: 30000 // Таймаут 30 секунд
      });
      const data = await response.json();
      
      if (data && data.messages) {
        console.log('Новые сообщения:', data.messages);
        updateUI(data.messages);
      }
      
      // Сразу же отправляем следующий запрос
      poll();
    } catch (error) {
      console.error('Ошибка polling:', error);
      // Retry после задержки
      setTimeout(poll, 5000);
    }
  }
  
  poll();
}

startLongPolling();

Реализация на сервере (Node.js)

// Сервер ждет новых данных перед ответом
app.get('/api/messages/long-poll', async (req, res) => {
  const userId = req.user.id;
  const startTime = Date.now();
  const timeout = 30000; // 30 секунд
  
  while (Date.now() - startTime < timeout) {
    const messages = await getNewMessages(userId);
    
    if (messages.length > 0) {
      // Если есть сообщения, сразу отправляем
      return res.json({ messages });
    }
    
    // Если нет — ждем 1 секунду и проверяем снова
    await sleep(1000);
  }
  
  // Таймаут истек, отправляем пустой ответ
  res.json({ messages: [] });
});

Характеристики

  • Минимум ненужных запросов: запрос отправляется только когда нужно
  • Низкая задержка: обновления приходят почти сразу
  • Требует ждущего сервера: сервер держит соединение открытым
  • Сложнее в реализации: нужно управлять таймаутами

Пример жизненного цикла

Время: 0с    - отправили запрос (сервер ждет)
Время: 3с    - пришли новые сообщения!
Время: 3с    - отправили ответ, отправляем новый запрос
Время: 8с    - пришли новые сообщения!
Время: 8с    - отправили ответ, отправляем новый запрос
Время: 35с   - таймаут, отправляем пустой ответ
Время: 35с   - отправляем новый запрос

Сравнительная таблица

ПараметрPollingLong Polling
ИнтервалФиксированныйЗависит от данных
ЗадержкаДо N секундМинимальная (秒)
ТраффикМного ненужных запросовОптимально
Нагрузка на серверВысокая (много запросов)Средняя (ждущие соединения)
СложностьПростаяСредняя
СовместимостьУниверсальнаТребует таймаутов

Проблемы и решения

Проблема Polling: много запросов

// Плохо: запрос каждую секунду
setInterval(() => fetch('/api/status'), 1000);

// Лучше: адаптивный интервал
let interval = 5000;
setInterval(async () => {
  const response = await fetch('/api/status');
  const data = await response.json();
  
  if (data.hasUpdates) {
    interval = 1000; // Часто проверяем, если есть обновления
  } else {
    interval = 30000; // Редко проверяем, если нет
  }
}, interval);

Проблема Long Polling: мертвые соединения

// Сервер должен иметь максимум таймаутов
const MAX_CONNECTIONS = 10000;
let activeConnections = 0;

app.get('/api/messages/long-poll', (req, res) => {
  if (activeConnections >= MAX_CONNECTIONS) {
    return res.status(429).json({ error: 'Too many connections' });
  }
  
  activeConnections++;
  
  // После ответа уменьшаем счетчик
  res.on('finish', () => {
    activeConnections--;
  });
  
  // ...
});

Когда использовать

Polling подходит для:

  • Некритичных обновлений (каждые 30 секунд)
  • Простых систем без сложной логики
  • Когда нужна максимальная совместимость
  • Мобильных приложений с ограниченным трафиком

Long Polling подходит для:

  • Чатов и мессенджеров (низкая задержка важна)
  • Уведомлений (нужна минимальная задержка)
  • Когда задержка менее секунды критична
  • Приложений с переменной частотой обновлений

Альтернативы

Для истинного реального времени используй WebSockets или Server-Sent Events (SSE):

// WebSocket (двусторонняя коммуникация)
const socket = new WebSocket('ws://api.example.com/messages');
socket.onmessage = (event) => {
  const message = JSON.parse(event.data);
  updateUI(message);
};

// Server-Sent Events (однусторонняя от сервера)
const eventSource = new EventSource('/api/messages/stream');
eventSource.onmessage = (event) => {
  const message = JSON.parse(event.data);
  updateUI(message);
};

Заключение

Polling — простой способ получать обновления, но с высокой задержкой и лишним трафиком. Long Polling — лучший компромисс между простотой и эффективностью для большинства применений. Если нужна истинная двусторонняя коммуникация в реальном времени, используй WebSockets.

В чем разница между Polling и Long Polling? | PrepBro