Google App Engine中是否可以进行长轮询?

时间:2010-09-01 08:15:17

标签: google-app-engine long-polling

我需要制作需要经常轮询服务器的应用程序,但GAE对请求有限制,因此提出大量请求可能会非常昂贵。是否可以使用长轮询并请求等待最长30秒进行更改?

3 个答案:

答案 0 :(得分:10)

谷歌AppEngine有一个新的功能通道API,你有 一个possibility to build a good realtime application

另一个解决方案是使用像mochiweb这样的第三方彗星服务器 或用iframe图案扭曲。

Client1,等待活动:

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

Client2,发送消息:

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

为了使用具有彗星模式的mochiweb,理查德琼斯写了一篇文章 主题(在谷歌上:理查德琼斯百万用户彗星应用程序)。

答案 1 :(得分:2)

我们尝试在App Engine上实现类似Comet的长轮询解决方案,结果好坏参与。

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

我看到的问题是长轮询之后的请求正在长轮询请求后面进行序列化(同步)​​。我可以在Chrome中查看跟踪内容并查看如下所示的时间表:

  1. 已发送请求1。获取(未修改)blob(等待更改)。
  2. 请求2已发送。修改blob。
  3. 完全超时后,请求1返回(数据未修改)。
  4. 请求2在服务器上处理,并返回成功。
  5. 我已经使用wireshark和Chrome /时间线来确认我是在远程轮询的不同TCP连接上向服务器发送修改请求。因此,这种snychronization必须惹恼App Engine生产服务器。据我所知,谷歌没有记录服务器行为的详细信息。

    我认为等待渠道API是我们从App Engine获得良好实时行为的最佳希望。

答案 2 :(得分:0)

我不认为长时间的民意调查是可能的。 Google appengine的默认请求超时为30秒。 在长轮询中,如果消息生成超过30秒,则它将失败。 你可能最好使用短轮询。

另一种方法是以30秒的限制“模拟”长轮询。如果消息未到达,例如20秒,服务器可以发送“令牌”消息而不是正常消息,要求客户端使用它并再次连接。

似乎有feature request(及其接受)谷歌appengine进行长期投票