2009-09-16 50 views
1

我一直在尋找的不是彗星或一個簡單的方法長輪詢推一些非常基本的AJAX更新瀏覽器。的Javascript計時器和阿賈克斯輪詢/調度

在我的研究中,我看到人們確實使用Javascript計時器以設定的時間間隔發送Ajax調用。這是一個壞方法嗎?它幾乎看起來太簡單了。還要考慮我將發送的更新不是關鍵數據,但他們將監視可能運行幾個小時的過程。

作爲一個例子 - 使用這種設計每隔10秒發送一次ajax呼叫3小時是否可靠?

感謝布

回答

3

一般情況下,使用定時器通過Ajax更新頁面上的內容是至少一樣強大依託像彗星長壽命的流連接。防火牆,簡短的DHCP租約等都可以中斷持久連接,但輪詢將在每個請求上重新建立客戶端連接。

權衡的是,投票通常需要在服務器上更多的資源。即使客戶投票的少數更新每隔10秒就可以把你的服務器比正常交互用戶,誰更有可能加載新頁面僅每隔幾分鐘就多了很多負擔,並會花費更少的時間移動到另一個站點之前這樣做。作爲一個數據點,我去年寫了一個簡單西納特拉/阿賈克斯玩具應用程序必須每日3-5獨立訪問者正常的「文本」的網頁,但它的Ajax回調URL迅速成爲任何網站的服務器上請求最多的部分,其中包括數個量級(或更多)的流量較高的站點。

最小化輪詢負載的一種方法是將Ajax回調服務器代碼與常規站點代碼(如果可能的話)分開並在其自己的應用程序服務器進程中運行。這個「服務中間件」服務可以處理輪詢回調,而不是放棄服務器線程/ Apache監聽器等。因爲這實際上構成了「我們在那裏呢?」的問題。

當然,如果您只希望一次使用poll服務的用戶數量很少(比如10個以下),請繼續並開始在同一個服務器進程中運行它。

+0

謝謝。我肯定需要計劃超過10個用戶。任何建議開始學習如何建立一個新的應用程序服務器進程? – Brian

+0

這只是部署應用程序堆棧的另一個實例。例如,如果您在Apache上運行PHP,則爲僅提供Ajax請求的虛擬主機提供單獨的docroot,並且不會加載其他應用程序代碼。對於Java應用程序,請使用獨立的servlet來處理回調。等等。最大限度地減少Ajax處理程序的佔用空間,並且可以進一步拉伸您的服務器資源。 – rcoder

+0

哦,我陷入了困境 - 非常感謝,非常有幫助。 – Brian

0

我認爲在這裏可能有用的一件事是在不變的時間間隔內進行輪詢很簡單,但通常是不必要的或不希望的。

我最近一直在嘗試的一種方法是對投票進行積極和消極的反饋。本質上,更新是活動的(發生變化)或被動的(沒有新的更改可用,因此不需要)。被動更新會增加輪詢間隔。有效的更新將輪詢間隔設置回基準值。

例如,在我正在處理的這個聊天中,不同的用戶發佈消息。輪詢間隔從5秒的高值開始。如果其他網站用戶正在聊天,則每5秒鐘更新一次。如果活動減慢,並且自從顯示最新消息以來沒有人在聊天,則輪詢間隔每次變慢和減慢約一秒,最後每3分鐘加一次。如果一小時後有人再次發送聊天消息,則輪詢間隔突然下降到5秒更新並開始減慢。

高活性 - >頻繁地輪詢。低活動 - >最終非常不頻繁的投票。