2010-09-01 83 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良好實時行爲的最大希望。

相關問題