2014-10-01 186 views
0

我創建了一個Web應用程序,我說我自己的API給它:因爲{since},其中{since}是unix時間戳如何從我自己的webapp查詢我自己的web api?

/api/v1.0/articles/new/{since} 

此API返回的新文章JSON。

我想添加自動更新到網站,並自動查詢文章,而用戶在網站上,但我不知道如何做到這一點。

我想用下面的JavaScript(jQuery的)來做到這一點:

setInterval(function() { 
    $.get('/api/v1.0/articles/new/{since}', function (data) { 
     /* parse data, add new articles to page */ 
     /* since = now */ 
    }); 
}, 30*1000) 

這將是正確的解決方案?我擔心如果有500人訪問我的網站,那麼我會每30秒收到500個請求,這可能會導致我的服務器中斷。

我可以嘗試其他可能的解決方案嗎?有什麼新的方式讓服務器將數據推送到Web應用程序,而不是我拉它並查詢? (這是否叫做彗星ajax?)

+0

構建一個讀取api的緩存。發送用戶(全部500個)讀取1個緩存文件。 – briansol 2014-10-01 19:53:00

回答

1

與500位用戶做30秒輪詢,你平均每秒鐘處理約17個請求。是否會殺死你的服務器取決於你在每個請求上做了什麼,你正在服務什麼其他請求,你的服務器運行什麼硬件等等。如果你對每個請求所做的只是對錶的簡單數據庫查詢 - 可以通過時間戳索引 - 每秒17個請求非常輕。但是,在我看來,你真的應該實現某種形式的服務器推送 - 你稱之爲「comet ajax」。首先,如果您的任何API調用需要超過30秒的時間,則在前一個API調用完成之前,您將執行另一個API調用,這可能會導致「雪球」效應。

服務器推送的具體方式取決於服務器堆棧上可用的內容,以及您希望客戶端瀏覽器支持的內容。例如,如果您運行的是Node.js,則可以使用socket.io包使用網絡套接字進行服務器推送。但是舊版瀏覽器不支持網絡套接字,並且並非所有網絡套接字的瀏覽器實現都是相同的,因此您可能需要考慮基於AJAX長輪詢多部分文檔流的方法。通常,您需要在服務器上安裝一些代碼或軟件包以支持您使用的方法,不過有一些解決方案可以透明地確定哪種方法最適合每個客戶端連接。 (例如,SignalR這樣做,但這是針對Microsoft/.NET堆棧的。)

您可能需要閱讀以下文章作爲出發點,然後根據您的特定技術堆棧發佈更多有針對性的問題,然後你對你需要支持哪些瀏覽器的假設。

http://techoctave.com/c7/posts/60-simple-long-polling-example-with-javascript-and-jquery

+0

最優秀的答案。謝謝你,先生! – bodacydo 2014-10-01 22:40:00