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

gRPC vs REST: сравнение по пунктам

Ранее мы уже делали посты про REST и SOAP, а также сравнивали их по пунктам. В предыдущем посте мы рассмотрели основные аспекты gRPC. Теперь сравним его с REST, чтобы понять, когда что использовать для проектирования API.

Protobuf вместо JSON / XML

  • REST: Обычно используются форматы сообщений JSON / XML / YAML. Такой формат удобен и понятен для человека, но обратная сторона этого – скорость передачи сообщений.
  • gRPC: Использует двоичный формат обмена сообщениями Protobuf. За счёт сжатия и бинарной сериализации это позволяет увеличить скорость передачи сообщений в разы. Обратная сторона – формат Protobuf нечеловекочитаем.

HTTP/2 вместо HTTP 1/1

  • REST: Обычно используются HTTP 1/1, который предполагает взаимодействие по типу запрос-ответ. Это означает, что когда микросервис получает несколько запросов от более чем одного клиента, он должен обслуживать их по одному, что замедляет работу всей системы.
  • gRPC: Использует HTTP/2 и позволяет группировать запросы в пакеты и устанавливать двунаправленное соединение. Теперь, когда микросервис получает несколько запросов от более чем одного клиента, он может обслуживать их одновременно и отдавать ответы в режиме реального времени.

gRPC строго определяет контракт

  • REST: Не даёт чёткого определения того, как должны быть описаны контракты. Да, можно использовать OpenAPI и Swagger для генерации кода, но на практике такое встречается нечасто. Обычно наоборот: из кода генерируют Swagger и вставляют в Confluence.
  • gRPC: Есть строгое определение того, как должны выглядеть запросы и ответы. Контракт определяется в файле .proto, который описывает типы сообщений и сервисы, которые предоставляются. Затем proto-файлы клиент может преобразовать в заглушки с помощью готовых плагинов кодогенерации от Google для разных языков программирования.

gRPC API дольше реализовывать

  • REST: Это мейнстрим и огромное коммьюнити, лёгкость и простота. Существует множество фреймворков и библиотек, которые упрощают разработку и тестирование REST API.
  • gRPC: Требует гораздо более серьёзного погружения и менее распространён. Для создания gRPC API необходимо использовать специальный формат данных Protobuf и определять контракты в файлах .proto. Также нужно учитывать особенности HTTP/2 и потоковой передачи данных.

Что выбрать

gRPC не является полной заменой REST во всех кейсах. API на gRPC может оказаться лучше REST в следующих случаях:

  1. Общение микросервисов между собой: связь с низкой задержкой и высокой пропускной способностью gRPC делает его особенно полезным для подключения архитектур, состоящих из легких микросервисов, где эффективность передачи сообщений имеет первостепенное значение.
  2. Системы где используется несколько языков программирования благодаря поддержке генерации собственного кода для широкого спектра языков разработки.
  3. Потоковая передача в реальном времени: когда требуется связь в реальном времени, способность gRPC управлять двунаправленной потоковой передачей позволяет системе отправлять и получать сообщения в режиме реального времени, не дожидаясь ответа отдельного клиента.
  4. Сети с низким энергопотреблением и низкой пропускной способностью, например, IoT: использование gRPC сериализованных сообщений Protobuf обеспечивает легкий обмен сообщениями, большую эффективность и скорость по сравнению с JSON.

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

КритерийgRPCREST
Чем являетсяФреймворкАрхитектурный стиль
Парадигма доступа к даннымУдалённый вызов процедурОбращение к ресурсам
ВендорGoogleНет
Год создания20152000
Транспортный протоколHTTP/2HTTP/1.1
Формат сообщенийProtobuf (бинарный и нечеловекоочитаемый)Человекоочитаемый текстовый (JSON, XML и другие)
ПроизводительностьВысокая, данные изначально сериализованыСредняя, данные требуют дополнительной сериализации
Поддержка двунаправленного соединенияЕсть благодаря HTTP/2Нет
Скорость обменаВыше в 7-10 раз, за счёт Protobuf и двунаправленного потокового соединенияНиже, обмен однонаправленный (запрос-ответ)
Сложность реализацииСложнее, необходимо использовать специальный формат данных Protobuf и определять контракты в файлах .protoПроще, много готовых решений и фреймворков
КодогенерацияВстроена, автоматическая генерация кода для загрузки клиентских приложений proto-контрактаТребуется стороннее решение, не всегда применимо
КонтрактСтрого требует определения контрактаКонтракт не является строго определяемым
ГибкостьМенее гибкий, так как требует строгого определенияБолее гибкий, свободное определение ресурсов и операций над ними
МасштабированиеВысокое, благодаря эффективному использованию сетевых ресурсов и двунаправленным соединениямНизкое, из-за ограничений по количеству соединений и сериализации данных
ТестируемостьМожно использовать стандартные или библиотеки для создания моков и автотестовСтандартные инструменты или браузер для отправки получений текстового формата API
Трассировка запросовНе поддерживается из коробки, но позволяет интеграцию с различными инструментами и платформамиМожет использовать стандартные заголовки HTTP для передачи информации о трассировке
Балансировка нагрузкиТребует специальной конфигурации и инструментовОбычно реализуется на стороне сервера. Может использовать стандартные решения
Лучше всего подходит дляВысокопроизводительных микросервисных архитектур или архитектур с большим объемом данныхПростых источников данных с чётко определенными ресурсами

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

Статьи

  1. gRPC vs REST, что выбрать для нового сервера? — Хабр. Есть также видео.
  2. Сравнение от Amazon.

Видео

  1. gRPC vs REST, что выбрать для нового сервера? — видео о статье 1.
  2. gRPC vs REST. Плюсы и минусы на примере реального проекта.