В чем преимущества gRPC по сравнению с REST
Что проверяют
Понимаете ли вы, откуда берутся преимущества gRPC и какой ценой, или просто повторяете «он быстрее». Следом обычно спрашивают, когда вы всё-таки выберете REST и как gRPC ведёт себя за балансировщиком в Kubernetes.
Как отвечать
Называйте преимущества вместе с механизмом:
- контракт в
.proto: схема одна на всех,Grpc.Toolsгенерирует клиент и базовый класс сервиса при сборке, строгие типы на обеих сторонах. В REST ту же роль играет OpenAPI, но он обычно вторичен к коду; - Protobuf вместо JSON: бинарный формат, сообщения меньше, сериализация дешевле по CPU. Схема эволюционирует через номера полей: новые поля старые клиенты просто игнорируют;
- HTTP/2: мультиплексирование многих вызовов в одном соединении, сжатие заголовков;
- стриминг: кроме унарных вызовов есть серверный, клиентский и двунаправленный потоки, в C# это
IAsyncStreamReader<T>иIServerStreamWriter<T>сawait foreach; - дедлайны и отмена: дедлайн клиента доезжает до сервера, там срабатывает
ServerCallContext.CancellationToken, и его можно передать дальше по цепочке вызовов.
В .NET сервер поднимается через Grpc.AspNetCore и MapGrpcService<T>(), клиент регистрируется через AddGrpcClient<T> поверх IHttpClientFactory, сквозная логика вешается интерсепторами.
Затем честно про ограничения. Браузер не умеет нативный gRPC, нужен gRPC-Web или JSON transcoding, который в ASP.NET Core есть начиная с .NET 7. Трафик нечитаем без инструментов вроде grpcurl, HTTP-кэширования по URL нет. Вывод: gRPC для внутреннего взаимодействия сервисов и стриминга, REST для публичных API, браузера и интеграций с внешними командами.
Где спотыкаются
Забывают про балансировку. HTTP/2 держит долгое соединение, и L4-балансировка Kubernetes Service отправит весь трафик клиента на один под. Нужен L7-балансировщик, service mesh или клиентская балансировка в Grpc.Net.Client.
Меняют номер или тип существующего поля в .proto. Совместимость ломается молча: старый клиент получит неверные данные или ошибку разбора. Номера удалённых полей помечают reserved.
Приводят безопасность как преимущество gRPC. TLS и аутентификация так же доступны и в REST, это не отличие.