Перейти к основному содержимому

Способы асинхронного взаимодействия в API

Асинхронное взаимодействие в API

Обзор посвящён асинхрону в API. Асинхрон в брокерах сообщений смотрите в этом посте. А здесь можно найти вводный пост по асинхронным интеграциям.

Асинхрон в API позволяет клиентским приложениям отправлять запросы на сервер и продолжать работу без ожидания ответа.

Зачем это нужно

  • Клиент не блокируется в ожидании ответа. Важно для операций, требующих значительного времени на обработку.
  • Сервер может обрабатывать больше запросов за счет асинхронной обработки.
  • Уменьшается количество необходимых запросов для получения обновленных данных, снижая нагрузку на сервер.

Способы асинхронного взаимодействия в API

1. Webhooks

  1. Клиент отправляет запрос серверу, указывая сallback URL.
  2. Сервер принимает запрос и отвечает клиенту, что запрос принят в обработку (например, 202 Accepted).
  3. Сервер обрабатывает запрос и отправляет клиенту запрос с результатами на сallback URL.

Пример: GitHub Webhooks отправляют автоматические уведомления о событиях в репозитории (например, push или pull request) на конфигурированный внешний сервис.

2. Polling

Клиент отправляет запрос на сервер, а затем раз в Т миллисекунд отправляет запросы к серверу, чтобы проверить статус операции.

Пример:

  1. Пользователь заполняет анкету и загружает скан паспорта.
  2. Фронт отправляет файл на сервер, получает 202 Accepted и позволяет пользователю заполнять анкету дальше.
  3. Сервер начинает процесс распознавания паспортных данных, который в среднем занимает 5-7 секунд.
  4. Приложение запускает фоновый процесс поллинга: раз в 1 секунду отправляет запрос для получения статуса обработки запроса.

3. Long Polling

Сервер получает запрос, но держит его открытым до момента появления новых данных. Это уменьшает количество запросов по сравнению с обычным поллингом. Работает на протоколе HTTP. После получения данных от сервера соединение закрывается.

Пример: Чат-приложения, где сервер держит соединение открытым до появления новых сообщений, и только после этого отправляет ответ.

4. Server-Sent Events (SSE)

Однонаправленный канал связи от сервера к клиенту, позволяющий серверу посылать события клиенту через открытое соединение. В отличие от Long Polling клиент может получать несколько событий и данных от сервера без необходимости устанавливать соединение заново.

Пример: Торговые платформы в реальном времени, где клиенты получают обновления цен акций без необходимости постоянного запроса к серверу.

5. WebSocket API

Протокол, обеспечивающий двустороннее постоянное соединение между клиентом и сервером, позволяя обмениваться данными в реальном времени. Это именно отдельный протокол (не HTTP), клиент и сервер могут без задержек обмениваться данными в обе стороны, без необходимости устанавливать и закрывать соединения по несколько раз.

Пример: Онлайн-игры, интерактивные приложения, где требуется немедленная реакция сервера на действия пользователя и наоборот.

Подборка материалов

Статьи

  1. Как мы доставляем сообщения с сервера на клиент в реальном времени (Superjob)
  2. Примеры асинхронных API
  3. VK: Зачем нужны очереди сообщений в микросервисной архитектуре
  4. SA: Интеграция, управляемая сервером (Опрос, долгий опрос и вебхуки)
  5. Создание приложений реального времени с помощью SSE
  6. Polling и long polling
  7. API-callbacks
  8. Callback API ВКонтакте
  9. Как использовать Websocket на примере
  10. Что такое веб-сокеты
  11. Server-Sent Events: пример использования
  12. Сравнение способов асинхронных интеграций (англ)
  13. HTTP/2 лонг поллинг vs вебсокеты
  14. Сравнение поллинга и лонг поллинга

Видео

  1. Что такое Webhook за 12 минут
  2. Что такое веб-сокеты за 4 минуты
  3. Сравение Webhook и Long Polling
  4. Убьет ли HTTP/2 лонг поллинг и вебсокеты
  5. Server-Sent Events: Простая замена веб-сокетам
  6. Server-Sent Events: Снимаем ограничения
  7. Собеседование на системного аналитика: разбор задачи на асинхронные запросы в REST API

Книги

  1. Сергей Константинов. API
  2. Джей Гивакс. Паттерны проектирования API
  3. Арно Лоре. Проектирование веб-API