Entorno de ejecución de Java 8

Con App Engine, puedes compilar aplicaciones web que usan la infraestructura escalable y los servicios de Google. App Engine ejecuta tu aplicación web con una JVM de Java 8. App Engine invoca las clases de servlet de tu app para administrar las solicitudes y preparar respuestas en este entorno.

La plataforma de App Engine brinda muchos servicios de API a los que tu código puede llamar. Tu aplicación también puede configurar tareas programadas que se ejecutan en intervalos específicos.

Cómo especificar el entorno de ejecución de Java 8 para tu app

Para que tu app use el entorno de ejecución de Java 8, agrega la siguiente línea de código a tu archivo appengine-web.xml:

<runtime>java8</runtime>

Ten en cuenta que las aplicaciones de App Engine que actualmente usan el entorno de ejecución de Java 7 se ejecutarán en el entorno de ejecución de Java 8 con tan solo hacer ese cambio.

Mejoras y actualizaciones en el entorno de ejecución de Java 8

El entorno de ejecución de App Engine para Java 8, que se basa en OpenJDK 8, admite todas las características existentes disponibles en el entorno de ejecución actual de Java 7, que se basa en OpenJDK 7, pero con las siguientes actualizaciones y mejoras:

  • No impone un administrador de seguridad como lo hace el entorno de ejecución de Java 7, lo que significa que tu código no estará restringido por problemas de permisos de Java.
  • Es compatible con todas las bibliotecas públicas estándar de Java.
  • Usa Jetty 9.
  • Admite las especificaciones de Java Servlet 3.1 y Java Servlet 2.5.
  • Admite todas las API basadas en Google Cloud accesibles desde la Biblioteca cliente de Google Cloud para Java.

Introducción

Cómo seleccionar el entorno de ejecución de Java 8

La API de App Engine para Java se representa con appengine-api-*.jar que se incluye en el SDK de App Engine como parte del SDK de Cloud (en el que * representa la versión de la API y el SDK de App Engine).

Incluye este archivo JAR en el directorio WEB-INF/lib/ de la aplicación para seleccionar la versión de la API que usa, o usa Maven a fin de administrar las dependencias. Si se lanza una nueva versión del entorno de ejecución de Java que incorpora cambios que no son compatibles con las apps existentes, ese entorno tendrá un nuevo número de versión principal.

Cómo usar Maven para manejar dependencias

Puedes usar Maven para gestionar todas las dependencias. Por ejemplo, esta entrada pom.xml incluye la última API de App Engine (Rappengine-api-1.0-sdk) disponible en Maven Central:

<dependency>
    <groupId>com.google.appengine</groupId>
    <artifactId>appengine-api-1.0-sdk</artifactId>
    <version><span class="notranslate exporttrans-dynamic">print setvar.appengine_java_version</span></version>
</dependency>

Zona de pruebas

El entorno de ejecución de Java de App Engine distribuye solicitudes de aplicaciones en varios servidores web, lo cual impide que una aplicación interfiera en otra. Una aplicación de App Engine no debe responder lentamente. Una solicitud web a una aplicación debe manejarse dentro de los 60 segundos (10 minutos para las solicitudes de TaskQueue). Los procesos que exceden este límite para responder se finalizan a fin de evitar sobrecargar el servidor web.

Ten en cuenta que el directorio /tmp es el único lugar en el que los usuarios pueden escribir archivos. Los archivos en /tmp consumirán la memoria asignada a tu instancia. Los archivos almacenados en esta ubicación solo están disponibles para esta instancia y solo desde el principio de esta instancia específica.

La forma habitual en la que tu aplicación obtiene archivos de recursos es empaquetar los archivos que necesitas con tu aplicación en WEB-INF y, a continuación, cargarlos desde la app con Class.getResource(), ServletContext.getResource() o métodos similares. De forma predeterminada, todos los archivos en el WAR son “archivos de recursos”. Puedes excluir archivos de este conjunto con el archivo appengine-web.xml.

Orden del cargador de clase JAR

A veces, puede ser necesario volver a definir el orden en el que los archivos JAR se analizan en busca de clases para resolver conflictos entre los nombres de clase. En estos casos, puedes otorgar la prioridad de carga a archivos JAR específicos si agregas un elemento <class-loader-config> que contenga elementos <priority-specifier> en el archivo appengine-web.xml. Por ejemplo:

<class-loader-config>
  <priority-specifier filename="mailapi.jar"/>
</class-loader-config>

Esto coloca a “mailapi.jar” como el primer archivo JAR en el que se buscarán clases, excepto aquellas en el directorio war/WEB-INF/classes/.

Si se priorizan varios archivos JAR, se usará su orden de carga original (uno con respecto al otro). En otras palabras, el orden para los elementos <priority-specifier> no importa.

Subprocesos

Con el entorno de ejecución de Java 8, puedes crear subprocesos mediante la API de ThreadManager de App Engine y las API incorporadas de Java, como new Thread(). Por el momento, si quieres llamar a las API de App Engine (com.google.appengine.api.*), debes hacerlo desde un subproceso de solicitud o un subproceso creado con la API de ThreadManager.

Una aplicación puede realizar lo siguiente:

Si creas ThreadPoolExecutor con currentRequestThreadFactory(), debes llamar de forma explícita a shutdown() antes de que se complete la solicitud de servlet. Si no lo haces, la solicitud no se completará y el servidor de aplicaciones fallará. Ten en cuenta que algunas bibliotecas pueden crear ThreadPoolExecutors por ti.

Una aplicación puede realizar varias operaciones en el subproceso actual, como thread.interrupt().

Cada solicitud está limitada a 50 subprocesos de solicitud de API de App Engine simultáneos.

Cuando uses subprocesos, usa objetos de nivel alto de simultaneidad, como Executor y Runnable. Estos se ocupan de muchos de los detalles sutiles, pero importantes, de la simultaneidad, como las interrupciones y la programación y contabilidad.

La cantidad máxima de subprocesos en segundo plano simultáneos creados por la API de App Engine es 10 por instancia. (Este límite no se aplica a los subprocesos de Java normales no relacionados con la API de App Engine).

Herramientas

IDE compatibles

Cloud Tools para Eclipse agrega nuevos asistentes de proyectos y configuraciones de depuración a los Eclipse IDE de tus proyectos de App Engine. Puedes implementar tus proyectos de App Engine en vivo a producción directamente desde Eclipse.

Cloud Tools for IntelliJ te permite ejecutar y depurar aplicaciones de App Engine en IntelliJ IDEA. Puedes implementar proyectos de App Engine en vivo a producción sin salir del IDE.

Herramientas de compilación compatibles

A fin de acelerar tu proceso de desarrollo, puedes usar los complementos de App Engine para Apache Maven o Gradle:

Servidor de desarrollo local

El servidor de desarrollo ejecuta tu aplicación en la computadora local para el desarrollo y las pruebas. El servidor simula los servicios de Cloud Datastore, y 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.

AppCfg

AppCfg se incluye en el SDK de App Engine para Java independiente. Es una herramienta multipropósito que maneja la interacción de la línea de comandos con tu aplicación que se ejecuta en App Engine. AppCfg puede subir tu aplicación en App Engine o actualizar la configuración del índice de Cloud Datastore para que puedas compilar índices nuevos antes de actualizar el código. También puede descargar los datos de registro de la app para que puedas analizar su rendimiento con tus propias herramientas.

Simultaneidad y latencia

La latencia de tu aplicación tiene el mayor impacto en la cantidad de instancias necesarias para entregar tu tráfico. Si procesas las solicitudes con rapidez, una única instancia puede manejar muchas solicitudes.

Las instancias de subprocesos únicos pueden controlar muchas solicitudes simultáneas. Por lo tanto, hay una relación directa entre la latencia y la cantidad de solicitudes que se pueden manejar en la instancia por segundo. Por ejemplo, 10 ms de latencia equivalen a 100 solicitudes por segundo por instancia.

Las instancias de subprocesos múltiples pueden controlar muchas solicitudes simultáneas. Por lo tanto, existe una relación directa entre la CPU consumida y la cantidad de solicitudes por segundo.

Las aplicaciones de Java admiten solicitudes simultáneas, de modo que una sola instancia puede manejar solicitudes nuevas mientras espera a que las demás se completen. La simultaneidad reduce de forma significativa la cantidad de instancias que requiere tu app, pero debes diseñarla para que acepte multiprocesos.

Por ejemplo, si una instancia B4 (aproximadamente 2.4 GHz) consume 10 Mcycles por solicitud, puedes procesar 240 solicitudes por segundo por instancia. Si consume 100 Mcycles por solicitud, puedes procesar 24 solicitudes por segundo por instancia. Estos números son el caso ideal, pero son bastante realistas en términos de lo que puedes lograr en una instancia.

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

Enviar comentarios sobre...

Entorno estándar de App Engine para Java 8