2010-07-07 79 views
1

我需要將警報發送到使用RoR編寫的基於Web的監視系統。蠻力解決方案是經常用javascript來輪詢輕量級控制器。當然,缺點是爲了在警報上獲得緊急響應時間,我必須非常頻繁地進行輪詢(每5秒鐘)。來自Rails應用程序的快速AJAX響應

我想到的一個想法是讓AJAX發起的輪詢線程在服務器端休眠,直到警報到達服務器。然後,服務器將喚醒睡眠線程,並獲得將立即顯示給Web客戶端的響應。這將允許我將輪詢間隔降低到每30秒或每分鐘一次,同時縮短提醒用戶的時間。

我沒有指望的一件事是,mongrel/rails沒有按照我的預期爲每個Web請求啓動一個線程。這意味着其他傳入的Web請求會阻塞,直到第一個線程的睡眠超時。

我試着撥弄「config.threadsafe!」在我的配置中,但似乎沒有將行爲更改爲每個請求模型的線程。另外,它似乎與config.threadsafe運行!是一個冒險的提議,可能需要對我現有的應用程序進行更多的測試和返工。

對我採取的方法有什麼想法或更好的方式來獲得我正在尋找的響應時間,而無需使用請求來氾濫服務器?

回答

1

您可以使用Rails Metal來提高控制器的性能,或者甚至可以將它完全分離爲Sinatra應用程序(Sinatra可以處理一些嚴重的請求吞吐量)。

另一個想法是使用Juggernaut或類似的東西來研究推送解決方案。

+0

這不是關於控制器的性能。我的問題是故意拖延一些服務器響應 - 而AJAX查詢正在等待警報 - 同時允許其他人繼續。 – Chris 2010-07-07 15:37:35

+0

我只是回顧過去的問題,並認爲我會在這一點上給予信任。 Juggernaut是Orbited的COMET解決方案。通過轉換到Phusion Passenger解決了我的雜種單線程問題。多麼容易的服務,讓您一起去! – Chris 2012-02-14 14:38:37

0

您可以考慮的一種方法是讓您的請求(部分或全部)在external queue中創建延期監控作業,並反過來定期通知監控應用程序。

+0

我看到了對排隊插件的引用,但認爲一旦你排隊請求來處理它,你仍然立即返回一個響應給客戶端。我想暫緩在服務器等待警報時向客戶端發送響應。也許我錯在排隊插件? – Chris 2010-07-07 15:39:49

0

您需要的是Juggernaut這是一個Rails插件,它允許您的應用程序發起連接並將數據推送到客戶端。換句話說,您的應用程序可以通過即時更新的優勢實時連接到服務器。

+0

劍聖確實看起來像一個合理的解決方案。不過,我討厭在防火牆中爲閃存打開一個新端口。 – Chris 2010-07-22 19:20:10