Ambiente di runtime Java 8

Con App Engine, puoi creare applicazioni web che utilizzano l'infrastruttura e i servizi scalabili di Google. App Engine esegue l'applicazione web utilizzando una JVM Java 8. App Engine richiama le classi servlet dell'app per gestire le richieste e preparare le risposte in questo ambiente.

La piattaforma App Engine fornisce molti servizi API integrati che il codice può chiamare. L'applicazione può anche configurare attività pianificate da eseguire a intervalli specificati.

Specifica il runtime Java 8 per la tua app

Per fare in modo che la tua app utilizzi il runtime Java 8, aggiungi la seguente riga al file appengine-web.xml:

<runtime>java8</runtime>

Il file appengine-api.jar incluso in Google Cloud CLI in platform/google_appengine/google/appengine/tools/java/lib/impl/appengine-api.jar rappresenta l'API App Engine per Java. Puoi anche accedere a questo file utilizzando il repository Maven che elenca tutte le versioni.

Puoi selezionare la versione dell'API utilizzata dall'applicazione includendo questo JAR nella directory WEB-INF/lib/ dell'applicazione oppure utilizzare Maven per gestire le dipendenze. Se viene rilasciata una nuova versione dell'ambiente di runtime Java che introduce modifiche non compatibili con le app esistenti, quell'ambiente avrà un nuovo numero di versione principale.

Utilizzo di Maven per gestire le dipendenze

Puoi utilizzare Maven per gestire tutte le dipendenze. Ad esempio, questa voce pom.xml include l'API App Engine più recente (Rappengine-api-1.0-sdk) disponibile in Maven Central:

<dependency>
    <groupId>com.google.appengine</groupId>
    <artifactId>appengine-api-1.0-sdk</artifactId>
    <version></version>
</dependency>

Sabbiera

Il runtime Java di App Engine distribuisce le richieste per le applicazioni su più server web e impedisce che un'applicazione interferisca con un'altra. Un'app di App Engine non deve rispondere lentamente. Una richiesta web a un'applicazione deve essere gestita entro il limite di timeout della richiesta. I processi che superano questo limite per rispondere vengono terminati per evitare di sovraccaricare il server web.

Tieni presente che l'unico posto in cui gli utenti possono scrivere file è la directory /tmp. I file in /tmp utilizzeranno la memoria allocata all'istanza. I file archiviati in questa posizione sono disponibili solo per questa istanza e solo per la durata di questa istanza specifica.

In genere, l'applicazione ottiene i file di risorse pacchettizzando i file a cui ti affidi con l'applicazione in WEB-INF, quindi caricali dall'app utilizzando Class.getResource(), ServletContext.getResource() o metodi simili. Per impostazione predefinita, tutti i file in WAR sono "file di risorse". Puoi escludere file da questo set utilizzando il file appengine-web.xml.

Ordine JAR del caricatore classi

A volte potrebbe essere necessario ridefinire l'ordine in cui i file JAR vengono analizzati per le classi, al fine di risolvere le collisioni tra i nomi delle classi. In questi casi, la priorità di caricamento può essere concessa a file JAR specifici aggiungendo un elemento <class-loader-config> contenente elementi <priority-specifier> nel file appengine-web.xml. Ad esempio:

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

"mailapi.jar" è il primo file JAR in cui eseguire la ricerca per i corsi, tranne quelli nella directory war/WEB-INF/classes/.

Se più file JAR hanno la priorità, verrà utilizzato l'ordine di caricamento originale (nel rispetto reciproco). In altre parole, l'ordine degli elementi <priority-specifier> stessi non è importante.

Thread

Con il runtime Java 8, puoi creare thread utilizzando l'API ThreadManager di App Engine e le API integrate di Java, ad esempio new Thread(). Attualmente, se vuoi chiamare le API App Engine (com.google.appengine.api.*), devi chiamare queste API da un thread di richieste o da un thread creato utilizzando l'API ThreadManager.

Un'applicazione può

Se crei un ThreadPoolExecutor con currentRequestThreadFactory(), shutdown() deve essere chiamato esplicitamente prima del completamento della richiesta servlet. In caso contrario, la richiesta non verrà completata e il server delle app non andrà a buon fine. Tieni presente che alcune librerie potrebbero creare ThreadPoolExecutors per te.

Un'applicazione può eseguire operazioni sul thread attuale, ad esempio thread.interrupt().

Ogni richiesta è limitata a 50 thread di richieste dell'API App Engine simultanei.

Quando utilizzi i thread, utilizza oggetti di contemporaneità di alto livello, come Executor e Runnable. Questi si occupano di molti dei dettagli sottili ma importanti della contemporaneità, come le interruzioni e la pianificazione e la tenuta della contabilità.

Il numero massimo di thread simultanei in background creati dall'API App Engine è 10 per istanza. Questo limite non si applica ai normali thread Java non correlati all'API App Engine.

Strumenti

IDE supportati

Cloud Tools for IntelliJ consente di eseguire ed eseguire il debug delle applicazioni App Engine all'interno di IntelliJ IDEA. Puoi eseguire il deployment dei tuoi progetti App Engine live in produzione senza uscire dall'IDE.

Strumenti di creazione supportati

Per velocizzare il processo di sviluppo, puoi usare i plug-in App Engine per Apache Maven o Gradle:

Server di sviluppo locale

Il server di sviluppo esegue l'applicazione sul tuo computer locale per lo sviluppo e il test. Il server simula i servizi Datastore. Il server di sviluppo può anche generare la configurazione per gli indici Datastore in base alle query eseguite dall'app durante il test.

Contemporaneità e latenza

La latenza della tua applicazione ha l'impatto maggiore sul numero di istanze necessarie per gestire il tuo traffico. Se elabori le richieste rapidamente, una singola istanza può gestire molte richieste.

Le istanze a thread singolo possono gestire una richiesta in parallelo. Esiste quindi una relazione diretta tra la latenza e il numero di richieste che possono essere gestite sull'istanza al secondo. Ad esempio, una latenza di 10 ms è uguale a 100 richieste/secondi/istanza.

Le istanze multi-thread possono gestire molte richieste in parallelo. Pertanto, esiste una relazione diretta tra la CPU utilizzata e il numero di richieste al secondo.

Le app Java supportano le richieste simultanee, quindi una singola istanza può gestire nuove richieste in attesa del completamento di altre richieste. La contemporaneità riduce notevolmente il numero di istanze richieste dalla tua app, ma devi progettare l'app per il multithreading.

Ad esempio, se un'istanza B4 (circa 2,4 GHz) utilizza 10 Mcicli per richiesta, è possibile elaborare 240 richieste al secondo per istanza. Se utilizza 100 Mcicli per richiesta, puoi elaborare 24 richieste al secondo per istanza. Questi numeri sono ideali ma sono abbastanza realistici in termini di ciò che puoi ottenere su un'istanza.

Versioni Java di App Engine

Tutti gli artefatti rilasciati che iniziano con la versione 2.x.x utilizzano il meccanismo di rilascio open source. Gli artefatti rilasciati che iniziano con la versione 1.9.9xx o precedenti utilizzano il sistema di compilazione interno. Per ulteriori dettagli, consulta il repository GitHub.

Variabili di ambiente

Le seguenti variabili di ambiente sono impostate dal runtime:

Variabile di ambiente Descrizione
GAE_APPLICATION L'ID della tua applicazione App Engine. Questo ID è preceduto dal prefisso "region code~", ad esempio "e~" per le applicazioni di cui è stato eseguito il deployment in Europa.
GAE_DEPLOYMENT_ID L'ID del deployment attuale.
GAE_ENV L'ambiente App Engine. Impostata su standard.
GAE_INSTANCE L'ID dell'istanza su cui è attualmente in esecuzione il servizio.
GAE_RUNTIME Il tempo di esecuzione specificato nel file app.yaml.
GAE_SERVICE Il nome del servizio specificato nel file app.yaml. Se non viene specificato alcun nome di servizio, viene impostato su default.
GAE_VERSION L'etichetta della versione corrente del servizio.
GOOGLE_CLOUD_PROJECT L'ID progetto Google Cloud associato alla tua applicazione.
PORT La porta che riceve le richieste HTTP.

Puoi definire variabili di ambiente aggiuntive nel file app.yaml, ma i valori precedenti non possono essere sostituiti.