Necesito hacer una aplicación que necesite sondear el servidor a menudo, pero GAE tiene limitaciones en las solicitudes, por lo que realizar muchas solicitudes podría ser muy costoso. ¿Es posible usar un sondeo largo y hacer que las solicitudes esperen el máximo de 30 segundos para los cambios?¿Es posible una encuesta larga en Google App Engine?
Respuesta
Google App Engine tiene una nueva API de Canal característica, la que tiene un possibility to build a good realtime application.
Otra solución es utilizar un servidor de cometa de tercera parte como mochiweb o torcido con un patrón de iframe.
Cliente1, a la espera de un evento:
client1 --Iframe Pattern--> Erlang/Mochiweb(HttpLongPolling):
Cliente2, el envío de un mensaje:
client2 --XhrIo--> AppEngine --UrlFetch--> Erlang/Mochiweb
Para utilizar mochiweb con el patrón de cometa, Richard Jones ha escrito un buen tema (en Google: Richard Aplicación de cometa Jones A para un millón de usuarios).
No creo que sea posible una votación larga. El tiempo de espera de solicitud predeterminado para google appengine es de 30 segundos. En sondeo largo si el mensaje tarda más de 30 segundos en generarse, se producirá un error. Probablemente sea mejor que use encuestas cortas.
Otro enfoque es "simular" largas encuestas dentro del límite de 30 segundos. Para hacer esto, si un mensaje no llega, digamos 20 segundos, el servidor puede enviar un mensaje "token" en lugar de un mensaje normal, lo que requiere que el cliente lo consuma y se conecte de nuevo.
Parece que hay feature request (y su aceptación) en google appengine de sondeo largo
Google App Engine ahora tiene Channel API para admitir encuestas largas. –
@Zhe comprobar cuándo se publicó y respondió la pregunta, no fue posible una votación larga. – naikus
Vaya, mi mal ... –
Hemos intentado implementar una solución de larga duración tipo Comet en App Engine, con resultados mixtos.
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
El problema que estoy viendo es que las solicitudes después de un largo polling individual, están recibiendo serialize (sincronizada) detrás de la petición de sondeo de largo. Puedo ver un rastro en Chrome y ver una línea de tiempo como esta:
- Pedido 1 enviado. GET (sin modificar) blob (esperar hasta que se modifique).
- Solicitud 2 enviada. Modificar el blob.
- Después del tiempo de espera completo, la solicitud 1 regresa (datos no modificados).
- La solicitud 2 se procesa en el servidor y devuelve resultados satisfactorios.
He utilizado wireshark y Chrome/timeline para confirmar que estoy enviando la solicitud de modificación al servidor en una conexión TCP distinta de la larga encuesta. Por lo tanto, esta snychronization debe aparecer en el servidor de producción de App Engine. Google no documenta este detalle del comportamiento del servidor, hasta donde yo sé.
Creo que esperar la API del canal es la mejor esperanza que tenemos de obtener un buen comportamiento en tiempo real de App Engine.
- 1. Google App Engine: ¿es posible hacer una consulta Gql LIKE?
- 2. ¿Es posible evitar DoSing en Google App Engine?
- 3. ¿Es posible usar Django 1.2 en Google App Engine?
- 4. Django + Pydev/Eclipse + Google App Engine: ¿es posible?
- 5. Encuesta larga en Django
- 6. Google App Engine Locking
- 7. Jinja2 en Google App Engine
- 8. Google App Engine Geohashing
- 9. Google-app-engine NDB
- 10. Google App Engine
- 11. eCommerce en Google App Engine
- 12. Google App Engine: get_or_create()?
- 13. Google app engine & CDN
- 14. Django en Google App Engine
- 15. ¿Qué tan rápido es Google App Engine?
- 16. web.py en Google App Engine
- 17. Google App Engine: ¿Cuál es su RDBMS?
- 18. Google App Engine en Google Apps Domain
- 19. Google App Engine: ¿quién es un administrador?
- 20. ¿Google App Engine es adecuado para mí?
- 21. ¿Google App Engine es compatible con ftp?
- 22. appengine_config.py en Google App Engine
- 23. Google App Engine en Silverlight
- 24. Google Maps y Google App Engine
- 25. Google App Engine retraso extraño
- 26. Frecuencia de sondeo AJAX: ¿para una encuesta larga o no para una encuesta larga?
- 27. debería dejar Google App Engine?
- 28. Pretty URLs en Google App Engine
- 29. Google App Engine: autenticación personalizada
- 30. ¿Es posible mapear múltiples dominios en una única aplicación de Google App Engine?
Channel API aún no es público. Aquí hay otros dos servicios alternativos para consultar: http://beaconpush.com http://pubnub.com –
Nota: Channel API se descontinuará y se cerrará en octubre de 2017. – Suma