Pregunta

necesito para hacer la aplicación que necesita servidor de sondeo a menudo, pero GAE tiene limitaciones en las solicitudes, por lo que hacer una gran cantidad de solicitudes podría ser muy costoso. ¿Es posible utilizar sondeo largo y hacen peticiones esperan el maxium 30 segundos para los cambios?

¿Fue útil?

Solución

Google App Engine tiene una nueva API de Canal característica, la que tiene un posibilidad de construir una buena aplicación en tiempo real .

Otra solución es utilizar un tercer servidor parte cometa como mochiweb o retorcidos con un patrón de marco flotante.

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 usar mochiweb con el patrón de cometa, Richard Jones ha escrito un buen tema (en Google: Richard Jones Un millón de usuario de la aplicación del cometa).

Otros consejos

Hemos intentado implementar un cometa-como solución a largo de votación 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 tras un largo de votación, están recibiendo serialize (sincronizada) detrás de la solicitud largo de votación. Puedo mirar una huella en Chrome y ver una línea de tiempo de esta manera:

  1. Solicitud 1 enviado. GET burbuja (no-modificado) (espera hasta que cambió).
  2. Solicitud 2 enviado. Modificar la burbuja.
  3. Después de tiempo de espera completo, Solicitud 1 devuelve (datos no modificado).
  4. Solicitud 2 se procesa en el servidor, y devuelve éxito.

He usado Wireshark y Chrome / línea de tiempo para confirmar que estoy enviando la solicitud de modificación al servidor en una conexión TCP distinta a la largo de votación. Por lo que este debe ser snychronization happing en el servidor de producción de App Engine. Google no documenta este detalle del comportamiento del servidor, por lo que yo sé.

Creo que la espera de la API de canal es la mejor esperanza que tenemos de conseguir un buen comportamiento en tiempo real desde App Engine.

No creo sondeo largo es posible. La solicitud de tiempo de espera predeterminado para google appengine es de 30 segundos. En sondeo largo si el mensaje tarda más de 30 segundos para generar, a continuación, se producirá un error. Usted es probablemente mejor usar corto de votación.

Otro enfoque es el de "simular" sondeo largo withing el límite de 30 seg. Para ello, si un mensaje no llega dentro de, digamos 20 segundos, el servidor puede enviar un mensaje de "señal" en lugar de un mensaje normal, que requiere el cliente para consumir y conectarse de nuevo.

Parece que hay solicitud de función (y su aceptado) en google appengine de sondeo largo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top