Ist lange Polling möglich in Google App Engine?
-
26-09-2019 - |
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?
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:
- Anfrage 1 abgeschickt. GET (unmodifizierten) Blob (warten, bis geändert).
- Anfrage 2 abgeschickt. Ändern Sie den Blob.
- Nach der Vollzeit-out, Anforderung 1 zurückkehrt (Daten nicht modifiziert).
- 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