Entorno de ejecución de Go

Con App Engine, puedes compilar aplicaciones web con el lenguaje de Programación Go. Tu aplicación de Go se ejecuta en la infraestructura escalable de Google y usa servicios y almacenamiento continuo a gran escala.

Introducción

App Engine compila y ejecuta el código de las aplicaciones de Go mediante un entorno de zona de pruebas seguro. Tu app recibe solicitudes web, ejecuta trabajo y envía respuestas mediante la interacción con este entorno.

El SDK de App Engine para Go brinda una interfaz similar al paquete http estándar de Go. Escribir aplicaciones de App Engine en Go es similar a escribir servidores web de Go independientes.

El entorno de ejecución de Go usa la versión 1.9 de Go. El SDK de App Engine incluye el compilador de Go y una biblioteca estándar, de modo que no tenga dependencias adicionales. Al igual que con otros entornos de ejecución, no toda la funcionalidad de la biblioteca estándar está disponible dentro de la zona de pruebas. Por ejemplo, los intentos de abrir una conexión o escribir un archivo mostrarán un error os.ErrPermission.

El SDK de App Engine incluye un servicio automatizado para compilar tu app, de modo que no necesites invocar el compilador tú mismo. Además, al igual que con el SDK de Python, tu app se volverá a compilar automáticamente cada vez que cambies el código fuente.

El entorno de ejecución de Go para App Engine es totalmente compatible con las goroutines, pero no con la ejecución en paralelo: las goroutines se programan sobre un único hilo del sistema operativo. Esta restricción a un solo hilo podría desaparecer en futuras versiones. Una misma instancia puede controlar varias solicitudes simultáneamente, lo cual significa que, por ejemplo, si una solicitud espera una llamada a la API de Cloud Datastore, la misma instancia puede procesar otra solicitud.

Las apps de Go se ejecutan en un entorno de zona de pruebas seguro con un conjunto de bibliotecas reducido. Por ejemplo, una app no puede escribir datos en el sistema de archivos local ni establecer conexiones de red arbitrarias. En cambio, las apps usan servicios escalables prestados por App Engine para almacenar datos y comunicarse por Internet.

La plataforma de App Engine brinda muchos servicios que tu código puede llamar.

Compilar una aplicación con Go brinda una introducción para desarrollar aplicaciones web con Go y App Engine.

Selecciona el entorno de ejecución de Go

El entorno de ejecución de Go debe especificarse en el archivo de configuración app.yaml, que se usa para implementar tu aplicación en App Engine. Por ejemplo:

runtime: go
api_version: go1

El primer elemento, runtime, selecciona el entorno de ejecución de Go.

El segundo elemento, api_version, selecciona qué versión del entorno de ejecución de Go usar. En el momento en que se escribe este documento, la versión más reciente del entorno de Go es go1, que es un alias del último lanzamiento de Go (actualmente go1.9). El identificador de versión se incrementará cuando el equipo de App Engine lance cambios al entorno que no sean compatibles con el código existente. Esto significa que puedes continuar usando las API anteriores hasta que puedas actualizar tu app y cambiar la configuración api_version. Los valores de api_version disponibles son go1 y go1.9.

Organiza las apps de Go

Cuando desarrollas una aplicación en Go de App Engine, tu código se particiona en uno o más servicios; cada uno de los cuales se encuentra habitualmente en su propio directorio, junto con un archivo app.yaml para el servicio:

- project-dir
   - service1-dir
      app.yaml
      src1-1.go
      src1-2.go
   - service2-dir
      app.yaml
      src2-1.go
      src2-2.go

Las aplicaciones de Go se organizan en paquetes que replican la estructura de directorios de tus archivos fuente. Cuando usas una instrucción import en el código fuente de App Engine, las herramientas de SDK interpretan las rutas relativas en import de dos maneras:

  • En relación con el directorio que contiene el archivo app.yaml del servicio

  • En relación con el subdirectorio src de todos los directorios en GOPATH (esto se denomina una ruta de importación "completamente calificada").

Por ejemplo, si GOPATH se define de esta manera:

export GOPATH=/home/fred/go

Y el archivo src1-1.go en el ejemplo del directorio del proyecto anterior contiene esta sentencia:

import "foo/bar"

El SDK de App Engine buscará el paquete "foo/bar" en estas ubicaciones cuando ejecutes o implementes service1:

project-dir/service1/foo/bar
/home/fred/go/src/foo/bar

Si incluyes las fuentes de tu paquete en GOPATH, debes tener cuidado de no ubicar el código fuente dentro ni debajo de un directorio en tu proyecto de App Engine que contenga archivos app.yaml. Si esto sucede, un paquete podría cargarse dos veces, una vez para la ruta relacionada con un directorio del servicio y una vez para la ruta completamente calificada. Esto puede causar problemas sutiles, por lo que el SDK de App Engine analiza tu proyecto y tu GOPATH, detecta este caso y lo informa como error.

Para obtener mejores resultados, te recomendamos lo siguiente:

  • Crea un directorio separado en tu proyecto para cada servicio.
  • Cada directorio del servicio debe contener el archivo app.yaml del servicio y uno o más archivos .go.
  • No incluyas ningún subdirectorio en el directorio de un servicio.
  • Tus archivos .go deben importar paquetes usando rutas completamente calificadas; coloca todo el código del paquete debajo de los directorios src que son elementos secundarios directos del directorio del proyecto o completamente fuera del directorio de tu proyecto.

Para obtener más información acerca de cómo estructurar los servicios, consulta la Descripción General de App Engine.

Para obtener una introducción a GOPATH de Go y cómo se relaciona con el desarrollo en App Engine, consulta El SDK de App Engine y los espacios de trabajo.

La zona de pruebas

La aplicación se ejecuta en un entorno de "zona de pruebas" restringido con el objetivo de permitir que App Engine distribuya solicitudes de aplicaciones entre múltiples servidores web y evitar que una aplicación interfiera en otra. En este entorno, la aplicación puede ejecutar el código, almacenar y consultar los datos en Cloud Datastore, usar el correo electrónico de App Engine, el servicio de recuperación de URL y servicios de usuario y analizar la solicitud web del usuario y preparar la respuesta.

Una aplicación de App Engine no puede hacer lo siguiente:

  • En el sistema de archivos. Las aplicaciones deben usar Cloud Datastore para almacenar datos persistentes. Leer del sistema de archivos está permitido y todos los archivos de la aplicación subidos con la aplicación están disponibles.

  • Responder lentamente. Una solicitud web a una aplicación debe manejarse en cuestión de segundos. Los procesos que tardan mucho tiempo en responder se finalizan para evitar una sobrecarga del servidor web.

  • Hacer otra clase de llamadas del sistema.

El entorno de ejecución de Go restringe el uso de paquetes de la biblioteca estándar que violarían las políticas de la zona de pruebas. Esas funciones se reemplazaron por stubs que muestran un error os.ErrPermission o se quitaron por completo.

Solicitudes en segundo plano

El código que se ejecuta en instancias de escalamiento manual o básico puede iniciar una solicitud que puede sobrevivir a la solicitud que la genera. Esto les permite a las instancias ejecutar tareas programadas o periódicas arbitrarias o continuar funcionando en segundo plano luego de que una solicitud haya regresado al usuario.

Usa runtime.RunInBackground para ejecutar el código en una goroutine en segundo plano:

err := runtime.RunInBackground(c, func(c appengine.Context) {
  // do something...
})

La función proporcionada se invocará con un contexto de segundo plano que es diferente del contexto brindado (y puede durar más que este). Ten en cuenta que existe un límite de 10 solicitudes en segundo plano simultáneas por instancia.

Herramientas

El SDK para App Engine incluye herramientas que te permiten probar tu aplicación y subir los archivos de la aplicación.

El servidor de desarrollo ejecuta tu aplicación en tu computadora local para probar tu aplicación. El servidor simula los servicios de Cloud Datastore y las restricciones de la zona de pruebas. El servidor de desarrollo también puede generar una configuración para los índices de Cloud Datastore con base en las consultas que la aplicación ejecuta durante la prueba.

La herramienta gcloud administra toda la interacción entre la línea de comandos y tu aplicación que se ejecuta en App Engine. Usas gcloud app deploy para subir tu aplicación a App Engine o actualizar archivos de configuración individuales como la configuración del índice de Cloud Datastore, la cual te permite generar nuevos índices antes de implementar tu código. También puedes visualizar los datos de registro de tu app, de modo que puedas analizar su rendimiento con tus propias herramientas.

Simultaneidad y latencia

La latencia de tu aplicación es el factor más importante a la hora de determinar cuántas instancias se necesitarán para entregar tu tráfico. Si procesas las solicitudes con rapidez, una única instancia puede manejar muchas solicitudes.

Existe una relación directa entre la latencia y la cantidad de solicitudes que pueden manejarse en la instancia por segundo. Por ejemplo, 10 ms de latencia equivalen a 100 solicitudes por segundo por instancia.

Una instancia del entorno de ejecución de Go puede controlar varias solicitudes de manera simultánea, a pesar de que solo una goroutine en ejecución obtendrá un tiempo de CPU a la vez. Otras goroutines pueden realizar operaciones de E/S (leer un archivo, hacer una llamada al sistema o a una API) mientras eso sucede.

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Entorno estándar de App Engine para Go