Сегодня поговорим не просто о RESTful API, о чем написано огромное количество публикаций, а о преимуществах и ограничениях внедрения каждого из его принципов.
Немного контекста для погружения - "Что такое RESTful API?"
RESTful API (Representational State Transfer): архитектурный стиль взаимодействия компонентов приложения в сети.
!Важное замечание! RESTful это именно набор правил для обмена сообщениями между клиентом и сервером, а не протокол обмена данными.
Пробежимся по определениям:
- Архитектурный стиль - это высокоуровневая стратегия организации системы, которая определяет общие правила взаимодействия между его компонентами (или разных систем);
- Протокол - это набор правил и соглашений, которые определяют, как данные передаются между различными системами или компонентами одной системы; примеры протоколов - HTTP, SMTP, FTP, POP3 и другие.
Стиль RESTful API включает в себя 6 принципов:
- Клиент-серверная архитектура
- Отсутствие состояний (Stateless)
- Кэширование
- Единообразие интерфейса + HATEOAS
- Слоистая архитектура (Layered system)
- Код по требованию (Code on done )
каждый из которых имеет свою область применения, а также преимущества и недостатки. О них и поговорим дальше.
1. Клиент-серверная архитектура
Взаимодействие программ построено на разделении ролей: клиент (запрашивает данные) и сервер (предоставляет данные).
Важный момент - роли каждого участника взаимодействия по API определяется реализуемым процессом и может меняться в зависимости от реализуемых функций.
Область применения:
(практически везде, так как сам API предполагает разделение ролей участников на клиент и сервер)
- интеграция со сторонними сервисами
- web-приложения и сайты (взаимодействие back-end и front-end)
- мобильные приложения (взаимодействие приложения с сервером)
Преимущества:
- Упрощает построение взаимодействия, так как каждый из участников взаимодействия (клиент - сервер) может быть перенесен на другое решение или платформу без внесения изменения в работу второго участника.
- Масштабируемость: можно добавить серверы для обработки большего числа запросов; реализуется за счет использования промежуточных устройства (балансировщик, маршрутизатор нагрузки и аналогичные), которые по встроенной логике управляют пересылкой полученных от клиентов сообщений на сервера. Таким образом при необходимости масштабирования решения по причине увеличения нагрузки (больше клиентских запросов), достаточно подключить к балансировщику дополнительные сервера без дополнительной настройки на стороне клиентов.
- Упрощение технической поддержки за счёт возможности отключения любого из серверов без потери сервиса; преимущество проистекает из схемы подключения с использованием промежуточного устройства (балансировщик) при котором можно безболезненно вывести из эксплуатации любой сервер, в этом случае балансировщик будет распределять новые клиентские запросы между оставшимися серверами и не потребуется вносить изменения в работу клиентов.
Недостатки:
- Сложность реализации функционала кэширования, так как запросы одного клиента, при распределении клиентских запросов между серверами с помощью балансировщика нагрузки, перебрасываются на разные сервера и нужно учитывать их суммарное состояние, что отчасти будет противоречить принципу "отсутствие состояний (Stateless)".
- Увеличение сетевой нагрузки при распределении клиентских запросов через балансировщик - запросы со всей информацией, необходимой для выполнения запросы, сначала передаются от клиента на балансировщик, после от балансировщика на сервер и после обработки ответ также пересылается по цепочке.
Больше другой полезной информации в ТГ канале: https://t.me/all_for_analyse
2. Отсутствие состояний (Stateless)
Каждый запрос от клиента к серверу обрабатывается независимо от предыдущих запросов. Сервер не хранит информацию о предыдущих запросах клиента. Клиент передает в запросе всю необходимую для обработки запроса информацию.
Область применения:
a) построение решений на микросервисной архитектуре;b) интернет - сервисы (торговля)
Преимущества:
- Масштабируемость: можно добавить серверы для обработки большего числа запросов, так как серверу не нужно «помнить» историю запросов клиента. Преимущество реализуется через использование промежуточных устройства (балансировщик, маршрутизатор нагрузки и аналогичные), которые по встроенной логике управляют пересылкой полученных от клиентов сообщений на сервера. В этом случае после добавления нового сервера, он может обрабатывать клиентские запросы, не "зная" историю предыдущих запросов клиента.
- Уменьшение времени обработки запроса, так как серверу не требуется сохранять и загружать историю запросов клиентов.
- Упрощение технической поддержки: любой сервер можно отключить без потери сервиса. Преимущество проистекает из схемы подключения с использованием промежуточного устройства (балансировщик) при котором можно безболезненно вывести из эксплуатации любой сервер, в этом случае балансировщик будет распределять новые клиентские запросы между оставшимися серверами, которым не требуется хранить историю предыдущих запросов клиентов.
Недостатки:
- Увеличение объема передаваемых данных, так как клиенту в запросе серверу требуется передать всю необходимую для обработки запроса информацию.
- Сложность с поддержкой целостности транзакций, в которых вызов следующей операции зависит от результатов предыдущей, а значит статус выполнения должен сохраняться на стороне клиента.
Больше другой полезной информации в ТГ канале: https://t.me/all_for_analyse
3. Кэширование
Ответы сервера могут кэшироваться (временно сохраняться), чтобы снизить нагрузку на сервер и ускорить загрузку данных. Кэширование может быть реализовано на стороне клиента, сервера или дополнительных промежуточных устройств.Где применяется:a) в любых решениях с учетом описанных недостатков, но в первую очередь в системах со статическими или редко изменяемыми данными
Преимущества:
- Уменьшение нагрузки на сервер, так как кэшированная информация сохраняется отдельно
- Сокращение времени ответа, так как серверу не требуется обрабатывать запрос, данные подтягиваются из кэша
- Общее уменьшение нагрузки на систему за счёт сокращения числа обращений к другим системам для получения данных, необходимых для обработки запроса
Недостатки:
- Сложность реализации кэша по причине его зависимость от прав доступа у клиента (например, если это дополнительные данные, передаваемые в составе HATEOAS), а также настройки избирательности хранимых данных
- Необходимость дополнительного контроля валидности данных в кэше с целью их удаления в момент устаревания
Продолжение статьи Преимущества и недостатки RESTful API (часть 2)
Дополнительные материалы по теме статьи: