Что такое Short Polling (короткий опрос) в контексте сетевого взаимодействия?

«Что такое Short Polling (короткий опрос) в контексте сетевого взаимодействия?» — вопрос из категории Сети, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Short Polling (Короткий опрос) — это простейшая клиент-серверная модель для получения обновлений, при которой клиент периодически отправляет HTTP-запросы (например, GET) на сервер, чтобы проверить наличие новых данных. Сервер обрабатывает каждый запрос и немедленно возвращает ответ, даже если актуальных данных для клиента нет.

Принцип работы:

  1. Клиент отправляет запрос на эндпоинт (например, /api/updates).
  2. Сервер проверяет состояние (есть ли новые данные для этого клиента).
  3. Сервер немедленно отвечает либо с новыми данными, либо с пустым ответом/статусом "нет изменений".
  4. Клиент ждёт заданный интервал (например, 2 секунды) и повторяет шаг 1.

Пример реализации клиента на C#:

public class UpdatePoller
{
    private readonly HttpClient _httpClient;
    private readonly string _apiUrl = "https://api.example.com/updates";
    private readonly int _pollingIntervalMs = 2000;
    private CancellationTokenSource _cancellationTokenSource;

    public async Task StartPollingAsync()
    {
        _cancellationTokenSource = new CancellationTokenSource();
        while (!_cancellationTokenSource.Token.IsCancellationRequested)
        {
            try
            {
                HttpResponseMessage response = await _httpClient.GetAsync(_apiUrl, _cancellationTokenSource.Token);
                if (response.IsSuccessStatusCode)
                {
                    string content = await response.Content.ReadAsStringAsync();
                    // Если сервер возвращает пустой массив или специальный статус при отсутствии данных
                    if (!string.IsNullOrEmpty(content) && content != "[]")
                    {
                        ProcessUpdate(content); // Обработка полученных данных
                    }
                }
            }
            catch (TaskCanceledException) { /* Опрос остановлен */ }
            catch (Exception ex) { /* Логирование ошибки сети */ }

            // Ожидание перед следующим запросом
            await Task.Delay(_pollingIntervalMs, _cancellationTokenSource.Token);
        }
    }

    public void StopPolling() => _cancellationTokenSource?.Cancel();
    private void ProcessUpdate(string data) => Console.WriteLine($"Получено обновление: {data}");
}

Преимущества:

  • Простота реализации как на клиенте, так и на сервере.
  • Широкая совместимость — работает через любой HTTP-прокси и брандмауэр.
  • Не требует постоянного соединения (в отличие от WebSockets).

Недостатки:

  • Высокая нагрузка на сервер и сеть из-за постоянных запросов, даже когда данных нет.
  • Задержка (латентность) в получении обновлений. Клиент узнаёт об изменении только во время следующего запроса (в среднем через половину интервала опроса).
  • Неэффективность при большом количестве клиентов или необходимости мгновенных обновлений.

Альтернативы: Для сценариев, требующих низкой задержки и эффективности, используют Long Polling, WebSockets или Server-Sent Events (SSE).