2010-10-06 11 views
7

Recentemente ho distribuito un'applicazione Spring MVC al motore di app di google e il tempo di caricamento iniziale è di circa 7 secondi. Una volta caricata l'applicazione, l'app è abbastanza reattiva. Ma, se l'app è inattiva per più di 1 minuto (non c'è NESSUN traffico), l'app deve essere nuovamente ricaricata da GAE, che richiede circa 7sec. Per un'applicazione a livello di PRD questo è inaccettabile. (L'app è vuota - Non sto ancora utilizzando JPA, Sitemesh, Spring Security, ecc. Carica solo una pagina jsp con del testo)Spring MVC on GAE: tempo di caricamento lento

L'unica "best practice" per risolvere il problema tempo di caricamento "Ho visto finora è di impostare un cron job che tocchi l'url ogni minuto, mantenendo quindi l'app" caricata ". Ovviamente questa è una soluzione terribile.

Quindi, ecco la domanda: ci sono delle "migliori pratiche" per Spring su GAE in termini di "reattività"? Poiché Google e la primavera stanno lavorando per sviluppare una migliore integrazione tra loro due, ci sono state notizie/progressi su questo problema? Non riesco a trovare nulla di concreto, è per questo che sto chiedendo qui

Discussioni Topic: http://groups.google.com/group/google-appengine-java/browse_thread/thread/80d014fd5abd526f

UPDATE

C'è un 'biglietto' per creare istanze riservate, come bene come logica di "riscaldamento": http://code.google.com/p/googleappengine/issues/detail?id=2456

+1

Per curiosità, perché il cron job "ovviamente" è una brutta soluzione. E '"ovviamente" gratta, ma se funziona ... –

+1

Man mano che l'applicazione cresce, la quantità di tempo impiegata per inizializzarsi aumenterà, quindi il lavoro cron di 1 minuto si trasformerà in un cron job di 30 secondi se l'app richiede 30 secondi da inizializzare, ecc.L'aggiunta della sicurezza a molla aumenterebbe il tempo di caricamento in modo abbastanza drastico. Inoltre, aggiunge una complessità inutile per un problema Spring/GAE che dovrebbe essere risolto. :) – Vladimir

risposta

2

GAE ha iniziato a fornire un servizio a pagamento, per cui è possibile avere un esempio a caldo riservato a tutti i tempi:

http://googleappengine.blogspot.com/2010/12/happy-holidays-from-app-engine-team-140.html

Always On - Per le applicazioni ad alta priorità con traffico a bassa o variabile, ora puoi prenotare istanze tramite la funzione Sempre attivo di App Engine. Always On è una funzionalità premium che costa $ 9 al mese che riserva tre istanze della tua applicazione, senza mai spegnerle, anche se l'applicazione non ha traffico. Ciò riduce l'impatto delle richieste di caricamento su applicazioni che hanno quantità di traffico piccole o variabili.

Insieme alle richieste di riscaldamento, questa è la soluzione migliore se si prevede di utilizzare GAE.

0

Ok, a causa della mancanza di risposte ho deciso di andare con il cron job (dal momento che non vedo altre opzioni a partire da ora)

Ecco il file cron.xml sto usando

<?xml version="1.0" encoding="UTF-8"?> 
<cronentries> 
    <cron> 
    <url>/keepalive</url> 
    <description>Keep the application alive</description> 
    <schedule>every 1 minutes</schedule> 
    </cron> 
</cronentries> 

Ed ecco il controller:


package com.xxxxxxxxxxxxx.web; 

import org.slf4j.Logger; 
import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 


@Controller 
@RequestMapping("/keepalive") 
public class KeepAliveController { 

    private Logger logger = org.slf4j.LoggerFactory.getLogger(KeepAliveController.class); 

    @RequestMapping(method = RequestMethod.GET) 
    public void keepAlive() { 
     logger.info("I'm alive!"); 
    } 
} 
+0

Per favore non farlo. http://code.google.com/appengine/kb/java.html#Should_I_Run_A_Cron_Job – kprevas

+0

Ho letto che, sfortunatamente, non c'è altro modo! A meno che non desideri che i miei utenti attenderanno 10 secondi prima che la mia pagina venga caricata, questo è l'UNICO modo per mantenerlo relativamente "pronto per la produzione". Come ho detto sopra, Google sta lavorando a una soluzione (sia a pagamento che gratuita). Fino a quando non verrà creata questa soluzione, molte persone che hanno creato applicazioni Java da distribuire su google non hanno fortuna: http://code.google.com/p/googleappengine/issues/detail?id=2456 – Vladimir

+1

Se la tua "produzione" "L'applicazione ha alcuni requisiti SLA (contratto di servizio), quindi è necessario prendere in considerazione soluzioni di hosting migliori di GAE. GAE non garantisce tempi di attività, tempi di risposta, ecc. E soprattutto non per gli account gratuiti. Se vuoi utilizzare GAE, i tuoi utenti dovranno pagare il tempo di attesa. Tuttavia, se hai bisogno di un qualche tipo di affidabilità, probabilmente stai pensando di spendere qualche soldo. –

2

Dal SDK 1.4.0 è possibile evitare questa latenza utilizzando warmup requests.
Le richieste di riscaldamento caricano il codice dell'applicazione in una nuova istanza prima che qualsiasi richiesta live raggiunga tale istanza.

+0

Funziona solo dopo aver caricato l'istanza iniziale (che richiede più di 10 secondi). – Vladimir