gRPC поддерживает четыре типа взаимодействия, три из которых — стриминг:
service Chat {
rpc Unary(Req) returns (Resp); // обычный
rpc ServerStream(Req) returns (stream Resp); // сервер стримит
rpc ClientStream(stream Req) returns (Resp); // клиент стримит
rpc BiDi(stream Req) returns (stream Resp); // оба стримят
}
Server streaming — клиент отправляет один запрос, сервер шлёт поток ответов. Пример: подписка на обновления цен.
func (s *server) ServerStream(req *pb.Req, stream pb.Chat_ServerStreamServer) error {
for i := 0; i < 10; i++ {
if err := stream.Send(&pb.Resp{Data: fmt.Sprintf("msg %d", i)}); err != nil {
return err
}
}
return nil
}
Bidirectional streaming — оба конца читают и пишут независимо. Идеально для чатов и real-time. Всё работает поверх одного HTTP/2 соединения с мультиплексированием. Стриминг экономит ресурсы: не нужен polling, данные пушатся по мере появления.