2010-09-01 22 views
8

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

10

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).

+0

Channel API aún no es público. Aquí hay otros dos servicios alternativos para consultar: http://beaconpush.com http://pubnub.com –

+0

Nota: Channel API se descontinuará y se cerrará en octubre de 2017. – Suma

0

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

+1

Google App Engine ahora tiene Channel API para admitir encuestas largas. –

+0

@Zhe comprobar cuándo se publicó y respondió la pregunta, no fue posible una votación larga. – naikus

+0

Vaya, mi mal ... –

2

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:

  1. Pedido 1 enviado. GET (sin modificar) blob (esperar hasta que se modifique).
  2. Solicitud 2 enviada. Modificar el blob.
  3. Después del tiempo de espera completo, la solicitud 1 regresa (datos no modificados).
  4. 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.