Что такое gRPC? Сравните его с REST. В каких случаях вы бы выбрали gRPC, а в каких — REST?

Ответ

gRPC (Google Remote Procedure Call) — это современный высокопроизводительный фреймворк с открытым исходным кодом для удаленного вызова процедур (RPC), разработанный Google. Он использует HTTP/2 в качестве транспортного протокола и Protocol Buffers (Protobuf) как язык описания интерфейсов (IDL) и формат сериализации данных.

Сравнение gRPC и REST:

ХарактеристикаgRPCREST
ПротоколHTTP/2В основном HTTP/1.1 (хотя может использовать и HTTP/2)
Формат данныхProtocol Buffers (бинарный, компактный)JSON (текстовый, человекочитаемый)
Контракт (API)Строгий, определяется в .proto файлахГибкий, часто описывается через OpenAPI/Swagger
ПроизводительностьОчень высокая (бинарная сериализация, мультиплексирование HTTP/2)Ниже (текстовый парсинг, больше накладных расходов)
Типы коммуникацииУнарный, серверный стриминг, клиентский стриминг, двунаправленный стримингЗапрос-ответ (Request-Response)
КодогенерацияВстроенная, генерирует клиентские и серверные заглушкиТребует внешних инструментов (например, Swagger Codegen)
Поддержка браузерамиОграниченная, требует прокси-слоя (gRPC-Web)Нативная, полная поддержка

Когда выбирать gRPC:

  • Внутренние коммуникации микросервисов: Идеальный выбор для связи между сервисами внутри системы, где производительность и низкая задержка критичны.
  • Стриминг данных: Когда требуется потоковая передача данных в реальном времени (например, в чатах, IoT, финансовых котировках).
  • Мобильные клиенты: Эффективен для мобильных приложений, так как экономит трафик и заряд батареи благодаря бинарному протоколу.
  • Системы со строгими контрактами: Когда важна строгая типизация API и минимизация ошибок на этапе интеграции.

Когда выбирать REST:

  • Публичные API: Когда API предназначен для внешних потребителей и важна простота интеграции, отладки и широкая поддержка инструментов (Postman, curl, браузеры).
  • Взаимодействие с браузерами: Если ваше приложение — это классический веб-сайт, где клиент находится в браузере, REST является нативным и самым простым решением.
  • Простота и скорость разработки: Для простых CRUD-сервисов или когда скорость выхода на рынок важнее максимальной производительности.
// Пример контракта gRPC в .proto файле
syntax = "proto3";

package greeter;

// Сервис Greeter
service Greeter {
  // Отправляет приветствие
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// Запрос, содержащий имя пользователя
message HelloRequest {
  string name = 1;
}

// Ответ, содержащий приветствие
message HelloReply {
  string message = 1;
}