Domanda

ho bisogno di fare applicazione che ha bisogno di server di sondaggio spesso, ma GAE ha delle limitazioni sulle richieste, in modo da fare un sacco di richieste potrebbe essere molto costoso. E 'possibile utilizzare polling lungo e fare richieste di attendere che il maxium 30 secondi per le modifiche?

È stato utile?

Soluzione

Google AppEngine ha una nuova funzione API Channel, con che si ha un possibilità di costruire una buona applicazione in tempo reale .

Un'altra soluzione è quella di utilizzare un terzo server parte cometa come mochiweb o contorti con un modello iframe.

Client1, in attesa di un evento:

client1 --Iframe Pattern--> Erlang/Mochiweb(HttpLongPolling):

Client2, l'invio di un messaggio:

client2 --XhrIo--> AppEngine --UrlFetch--> Erlang/Mochiweb

Per usare mochiweb con il modello cometa, Richard Jones ha scritto un buon argomento (su google: Richard Jones A Million-utente Comet Application).

Altri suggerimenti

Abbiamo provato l'attuazione di una cometa come soluzione a lungo polling su App Engine, con risultati alterni.

def wait_for_update(request, blob):
    """
    Wait for blob update, if wait option specified in query string.
    Otherwise, return 304 Not Modified.
    """
    wait = request.GET.get('wait', '')
    if not wait.isdigit():
        return blob
    start = time.time()
    deadline = start + int(wait)
    original_sha1 = blob.sha1
    try:
        while time.time() < deadline:
            # Sleep one or two seconds.
            elapsed = time.time() - start
            time.sleep(1 if elapsed < 7 else 2)
            # Try to read updated blob from memcache.
            logging.info("Checking memcache for blob update after %.1fs",
                         elapsed)
            blob = Blob.cache_get_by_key_name(request.key_name)
            # Detect changes.
            if blob is None or blob.sha1 != original_sha1:
                break
    except DeadlineExceededError:
        logging.info("Caught DeadlineExceededError after %.1fs",
                     time.time() - start)
    return blob

Il problema che sto vedendo è che le richieste a seguito di un lungo polling, sono sempre serialize (sincronizzato) dietro la richiesta a lungo polling. Posso guardare una traccia in Chrome e vedere una linea temporale come questo:

  1. Richiesta 1 inviato. blob GET (non modificato) (attesa fino modificata).
  2. Richiesta 2 inviato. Modificare il blob.
  3. Dopo pieno time-out, Richiesta 1 restituisce (dati non modificato).
  4. Richiesta 2 viene processato sul server e restituisce il successo.

ho usato Wireshark e Chrome / sequenza temporale per confermare che io mando la richiesta di modifica al server su una connessione TCP distinto dal lungo polling. Quindi questo snychronization deve essere happing sul server di produzione App Engine. Google non documenta questo dettaglio del comportamento del server, per quanto ne so.

Credo che in attesa che l'API canale è la migliore speranza che abbiamo di ottenere un comportamento buono in tempo reale da App Engine.

Non credo che lungo polling è possibile. Il timeout di richiesta di default per Google AppEngine è di 30 secondi. In polling lungo se il messaggio richiede più di 30 secondi per generare, allora fallirà. Siete probabilmente meglio utilizzando breve polling.

Un altro approccio è quello di "simulare" polling lungo withing il limite di 30 sec. Per fare questo se un messaggio non arriva entro, diciamo 20 secondi, il server può inviare un messaggio "token" al posto di un normale messaggio, che richiede al cliente di consumarlo e connettersi di nuovo.

Sembra che ci sia richiesta di funzionalità (e la sua accettato) su google AppEngine per polling lungo

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top