Frage

Ich brauche Anwendung zu machen, dass Bedürfnisse Umfrage Server oft, aber GAE hat seine Grenzen auf Anfragen, so viele Anfragen machen sehr teuer werden könnte. Ist es möglich, lange Abfrage zu verwenden und Anfragen für das maxium 30 Sekunden Änderungen warten machen?

War es hilfreich?

Lösung

Google App Engine hat eine neue Funktion Channel-API, mit dem Sie ein Möglichkeit zu baut eine gute Echtzeit-Anwendung .

Eine andere Lösung ist es, einen dritten Teil Komet-Server wie mochiweb zu verwenden oder mit einem iframe Muster verdreht.

Client1, ein Ereignis warten:

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

Client2, eine Nachricht zu senden:

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

Um mochiweb mit Komet Muster zu verwenden, hat Richard Jones eine gute geschrieben Thema (auf Google: Richard Jones A Million-User-Comet-Anwendung).

Andere Tipps

Wir haben versucht, die Umsetzung eine Comet-wie lange Polling Lösung auf App Engine, mit gemischten Ergebnissen.

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

Das Problem, das ich zu sehen bin, ist, dass Anfragen nach einem langfris Polling ein, werden immer serialize (synchronisiert) hinter der Lang Polling Anfrage. Ich kann in Chrome auf einer Spur suchen und eine Zeitleiste wie diese:

  1. Anfrage 1 abgeschickt. GET (unmodifizierten) Blob (warten, bis geändert).
  2. Anfrage 2 abgeschickt. Ändern Sie den Blob.
  3. Nach der Vollzeit-out, Anforderung 1 zurückkehrt (Daten nicht modifiziert).
  4. Anfrage 2 wird auf dem Server verarbeitet und kehrt Erfolg.

Ich habe wireshark und Chrom / Timeline zu bestätigen verwendet, dass ich die Änderungsanforderung auf eine bestimmte TCP-Verbindung zum Server aus dem Lang Polling einer AM sendet. Also diese snychronization auf der App Engine Produktionsserver werden happing müssen. Google nicht dieses Detail des Serververhalten dokumentieren, soweit ich weiß.

Ich denke, für den Kanal API wartet die beste Hoffnung, die wir haben von App Engine gutes Echtzeitverhalten zu bekommen.

Ich glaube nicht lange Polling möglich ist. Die Standard-Timeout-Anfrage für Google appengine beträgt 30 Sekunden. In Lang-Abfrage, wenn die Nachricht mehr als 30 Sekunden zu erzeugen, nimmt, dann wird es scheitern. Sie sind wahrscheinlich besser dran kurzen Polling.

Ein weiterer Ansatz ist es, „Simulieren“ Lang-Abfrage der 30 Sekunden Grenze withing. Um dies zu tun, wenn eine Nachricht in nicht ankommen, sagen wir 20 Sekunden, kann der Server anstelle einer normalen Nachricht ein „Token“ Nachricht senden, benötigen Sie den Client es zu konsumieren, und schließen Sie es erneut.

Es scheint Feature-Anfrage zu sein (und seine angenommen) auf google App Engine für langen Polling

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top