Pergunta

Preciso fazer aplicativos que precisam pesquisar o servidor com frequência, mas o GAE tem limitações nas solicitações, portanto, fazer muitas solicitações pode ser muito caro. É possível usar pesquisas longas e fazer solicitações aguardarem o maxium 30 segundos para alterações?

Foi útil?

Solução

Google AppEngine tem uma nova API de canal de recursos, com isso você tem um possibilidade de criar um bom aplicativo em tempo real.

Outra solução é usar um servidor de cometa de terceira parte como o Mochiweb ou torcido com um padrão IFRAME.

Client1, esperando um evento:

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

Client2, enviando uma mensagem:

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

Para usar o Mochiweb com o padrão do cometa, Richard Jones escreveu um bom tópico (no Google: Richard Jones um aplicativo de cometes de um milhão de usuários).

Outras dicas

Tentamos implementar uma solução de polpa longa do tipo cometa no mecanismo de aplicativos, com resultados mistos.

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

O problema que estou vendo é que os pedidos após uma policial longa estão sendo serializados (sincronizados) por trás da solicitação de polpa longa. Eu posso olhar para um rastro no Chrome e ver uma linha do tempo como esta:

  1. Solicitação 1 enviado. Get (não modificado) Blob (aguarde até alterar).
  2. Solicitação 2 enviado. Modifique o blob.
  3. Após o tempo limite, a solicitação 1 retorna (dados não modificados).
  4. A solicitação 2 é processada no servidor e retorna o sucesso.

Eu usei o Wireshark e o Chrome/Linha do tempo para confirmar que estou enviando a solicitação de modificação ao servidor em uma conexão TCP distinta do longo de empolgação. Portanto, essa snychronização deve estar acontecendo no servidor de produção de motores do App. O Google não documenta esse detalhe do comportamento do servidor, tanto quanto eu sei.

Acho que esperar pela API do canal é a melhor esperança de obter um bom comportamento em tempo real do App Engine.

Eu não acho que as pesquisas longas sejam possíveis. O tempo limite da solicitação padrão para o Google AppEngine é de 30 segundos. Em longas pesquisas, se a mensagem levar mais de 30 segundos para gerar, ela falhará. Você provavelmente está melhor usando pesquisas curtas.

Outra abordagem é "simular" longas pesquisas com o limite de 30 segundos. Para fazer isso se uma mensagem não chegar dentro, digamos 20 segundos, o servidor poderá enviar uma mensagem "Token" em vez de uma mensagem normal, exigindo que o cliente a consuma e se conecte novamente.

Parece haver solicitação de recurso (e é aceito) no Google AppEngine para pesquisas longas

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top