我有一個Web應用程序,我試圖通過減少運行的數據庫查詢的數量來提高效率。我傾向於實施某種類型的Comet風格解決方案,但是我在這個部門缺乏經驗讓我懷疑是否存在更簡單的解決方案。彗星(服務器推送)我在找的答案?
爲簡便起見,我們只想說,我有一個包含網絡,其當前狀態的系統列表(無論是向上或向下)的數據庫。用戶可以登錄Web應用程序並選擇她感興趣監視的系統。之後,她可以訪問顯示當前系統數量的監控頁面。
截至目前,使用Ajax刷新計數...客戶端每隔一分鐘向服務器發送一個請求,服務器依次對數據庫運行查詢以獲取當前計數並將結果返回給客戶端。我知道這是低效的;對於每個登錄的客戶端,每分鐘都會對數據庫運行另一個查詢。 O(n)=壞!
我知道我可以使用某種類型的緩存,如分佈式緩存,但它仍然意味着它的每分鐘每個用戶的請求。更好,但我仍然覺得它不是最好的解決方案。
我想象更多的東西是這樣的:
- 每一分鐘的服務器運行一個查詢拉計數所有目前下跌的系統。
- 服務器然後將這些數據推送到感興趣的客戶端。
這樣無論登錄多少用戶並觀看監控頁面,服務器每分鐘只運行一個查詢。 O(1)=好!問題是,即使在我所做的所有研究之後,我都無法完全弄清楚如何實現這一點。說實話,我並不完全理解我在尋找什麼,所以這使得研究解決方案變得非常困難。所以我希望更多開明的開發者能夠帶領我走向正確的方向。
我相信你剛纔提到的長輪詢,不是嗎?在這兩種情況下,客戶端仍然在發送請求,導致服務器採取行動,這正是我想要避免的。 此外,每次客戶端請求時系統的狀態都不會更新。該數據已經保存在數據庫中,並獨立於此過程進行更新。當客戶端發送請求時,服務器正在對數據庫運行查詢以爲每個系統提取最近存儲的狀態。 – jonyamo
好的,我的答案的第二部分已經被清除了。回覆。第一部分:彗星解決方案是一種長期投票。我的建議不是長時間輪詢,而是在特定的時間間隔內做短暫的請求。這意味着客戶端不會立即通知服務器狀態的變化,而只是每隔一段時間。 – Wolfgang