Question

Je dois faire une demande que les besoins au serveur poll souvent, mais GAE a des limites sur les demandes, rendant ainsi un grand nombre de demandes pourrait être très coûteux. Est-il possible d'utiliser à long sondages et faire des demandes attendent le maxium 30 secondes pour les changements?

Était-ce utile?

La solution

Google AppEngine a une nouvelle fonctionnalité API Channel, avec ce que vous avez possibilité de construire une bonne application en temps réel .

Une autre solution consiste à utiliser une troisième partie serveur de la comète comme mochiweb ou tordu avec un motif de iframe.

Client1, en attendant un événement:

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

Client2, l'envoi d'un message:

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

Pour utiliser mochiweb avec motif comète, Richard Jones a écrit une bonne sujet (sur Google: Richard Jones A Million utilisateur Comet Application).

Autres conseils

Nous avons essayé la mise en œuvre d'une comète comme solution à long polling sur App Engine, avec des résultats mitigés.

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

Le problème que je vois est que les demandes suivantes un long sondage, obtiennent serialize (synchronisé) derrière la demande de longue interrogation. Je peux regarder une trace dans Chrome et voir un calendrier comme celui-ci:

  1. Demande 1 envoyé. GET blob (non modifié) (attendre que modifié).
  2. Demande 2 envoyé. Modifier le blob.
  3. Après le temps-out complet, demande 1 renvoie (données non modifiée).
  4. Demande 2 se traité sur le serveur, et retourne le succès.

Je l'ai utilisé Wireshark et Chrome / timeline pour confirmer que je vous envoie la demande de modification du serveur sur une connexion TCP distincte de celle à long sondage. Donc, ce snychronization doit être happing sur le serveur de production App Engine. Google ne documente pas ce détail du comportement du serveur, pour autant que je sais.

Je pense en attente de l'API de canal est le meilleur espoir que nous avons d'obtenir un comportement à temps réel de bonne App Engine.

Je ne pense pas à long polling est possible. Le délai d'attente de requête par défaut pour Google AppEngine est de 30 secondes. Dans longue interrogation si le message prend plus de 30 secondes pour générer, il échouera. Vous êtes probablement mieux à l'aide à court sondage.

Une autre approche consiste à « simuler » à long polling withing la limite de 30 secondes. Pour ce faire, si un message ne se manifeste pas dans, disons 20 secondes, le serveur peut envoyer un message « jeton » au lieu d'un message normal, exiger du client qu'il consomme et se connecter à nouveau.

Il semble être demande de fonctionnalité (et son accepté) sur Google appEngine pour une longue interrogation

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top