Streaming RPC

Тема дорожной карты · Golang

gRPC Streaming в Go расширяет базовую модель запрос/ответ gRPC, позволяя вести непрерывный двунаправленный обмен данными по одному HTTP/2-соединению, что необходимо для приложений реального времени: чат-сервисов, live-дашбордов и конвейеров телеметрии. Пакет google.golang.org/grpc поддерживает четыре модели взаимодействия: унарную, серверный стриминг, клиентский стриминг и двунаправленный стриминг — все объявляются с ключевым словом stream в .proto-файлах и компилируются через protoc-gen-go-grpc. На стороне сервера сообщения принимаются через stream.Recv() и отправляются через stream.Send(), а goroutines и каналы координируют конкурентные чтения и записи безопасно. gRPC Streaming естественно интегрируется с context.Context для отмены и дедлайнов, а также с OpenTelemetry для распределённой трассировки через границы сервисов. Понимание gRPC Streaming — ключевой навык для Golang-разработчиков, строящих event-driven микросервисы и Kubernetes-native бэкенды.

Как это работает

Streaming RPC — HTTP/2-based RPC с Protocol Buffers (.proto) как языком схемы. protoc + protoc-gen-go-grpc генерируют Go-server + client stubs из .proto-файлов. Streaming-варианты (unary, server-streaming, client-streaming, bidi). Reflection для introspection (grpcurl). Connect-go (альтернатива Buf) даёт gRPC-совместимые HTTP/1 + HTTP/2 серверы — interoperable с gRPC-клиентами. gRPC-Gateway экспонирует gRPC-сервисы как REST + OpenAPI.

Когда применять

gRPC — для internal service-to-service, когда важны latency + schema-дисциплина; типизированные контракты ловят много багов на compile time. В паре с Buf — для build + lint proto-файлов. Для публичных API — gRPC-Gateway или Connect для REST/HTTP рядом. Для browser-to-server Connect-go чище, чем gRPC-Web. Избегайте gRPC для одноразовых скриптов или крошечных сервисов — REST проще.

Типичные ошибки

Ловушки Streaming RPC: регенерация proto-файлов без коммита (CI ломается из-за отсутствия сгенерированного кода); breaking changes в .proto без bump версии (клиенты валятся непонятным образом); огромные proto-пакеты, затрагивающие каждый сервис на изменение; игнор context.Context deadlines (вызовы висят навеки).

Связанные понятия

Полезные ресурсы