В чем преимущества gRPC по сравнению с REST
Что проверяют
Понимаете ли вы, откуда берутся преимущества gRPC и чем за них платят, или просто повторяете «он быстрее». Следом обычно спрашивают, где бы вы gRPC не взяли и как его балансировать в Kubernetes.
Как отвечать
Преимущества, и сразу откуда они:
- контракт в
.proto: сервис и сообщения описаны один раз, клиент и сервер генерируются из одного файла черезgrpc_tools.protocиз пакетаgrpcio-tools. Поле не переименуется молча на одной стороне; - Protocol Buffers: бинарный формат с номерами полей вместо имён, сообщения компактнее JSON и быстрее разбираются. Совместимость держится на правиле: новые поля получают новые номера, старые не переиспользуются;
- HTTP/2: много параллельных вызовов в одном постоянном соединении, сжатие заголовков;
- стриминг: четыре типа вызовов, унарный, серверный поток, клиентский поток и двунаправленный. В REST для этого нужны WebSocket или SSE;
- дедлайны и статусы: дедлайн вызова передаётся дальше по цепочке, есть свои коды ошибок (
DEADLINE_EXCEEDED,UNAVAILABLE) и интерсепторы для логов и авторизации.
В Python это grpcio с асинхронным API grpc.aio. Сгенерированные классы статически не типизированы, подсказки для mypy даёт mypy-protobuf.
Цена тоже нужна в ответе. Из браузера gRPC напрямую не вызвать, нужен gRPC-Web или Connect через прокси. Трафик не читается глазами: вместо curl нужен grpcurl и включённый reflection. HTTP-кеширование не работает. Долгие HTTP/2-соединения ломают балансировку на уровне L4: обычный Service в Kubernetes отправит все запросы клиента в один под, нужен L7-балансировщик или service mesh.
Итог: gRPC хорош для внутренних вызовов между сервисами под нагрузкой и для стриминга, REST остаётся выбором для публичного API и браузера.
Где спотыкаются
Говорят «gRPC всегда быстрее». На редких запросах с маленькими ответами разница незаметна, а узким местом обычно оказывается база.
Называют плюсом «интеграцию с Kubernetes», хотя именно балансировка там доставляет больше всего проблем.
Забывают, что REST тоже может работать поверх HTTP/2, и путают транспорт с форматом сообщений.