2010-09-01 80 views

回答

10

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

另一种解决方案是使用一个第三部分彗星服务器像了Mochiweb 或具有IFRAME图案扭曲。

客户端1,等待一个事件:

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

客户机2,发送消息:

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

使用带有彗星图案了Mochiweb,理查德·琼斯写了一个良好的 主题(在谷歌:理查德琼斯百万用户彗星应用程序)。

+0

渠道API尚未公开。以下是另外两种可供选择的服务: http://beaconpush.com http://pubnub.com – 2010-09-01 23:04:29

+0

注意:Channel API将于2017年10月停止使用并关闭。 – Suma 2017-07-28 11:32:21

0

我不认为长轮询是可能的。 google appengine的默认请求超时时间为30秒。 在长时间轮询中,如果消息的生成时间超过30秒,则会失败。 你可能使用短轮询更好。

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

似乎有feature request(和它的接受)在谷歌AppEngine上的长轮询

+1

Google App Engine现在拥有Channel API来支持长轮询。 – 2012-12-18 10:04:09

+0

@检查问题发布和回答的时间,然后长轮询是不可能的。 – naikus 2012-12-19 10:57:50

+0

哎呀,我的坏... – 2012-12-29 10:06:55

2

我们试图实现在App Engine类似彗星的长轮询的解决方案,但结果喜忧参半。

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发送。 GET(未修改)blob(等到更改)。
  2. 请求2发送。修改blob。
  3. 充满后超时,请求1点返回(数据未修饰的)。
  4. 请求2在服务器上得到处理,并返回成功。

我已经使用wireshark和Chrome /时间线来确认我AM发送修改请求到服务器上的一个独立的TCP连接从长轮询之一。因此,这种同步必须在App Engine生产服务器上进行。就我所知,Google没有记录服务器行为的这些细节。

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

相关问题