2012-08-01 9 views
1

爲我的Rails-App如果上傳新數據,我需要調用所有連接的客戶端。所以我想用websockets。目前,我已經創造了初始化一個新的文件,該文件將啓動插槽服務器的新線程:是不是很好練習啓動em-websocket與rails應用程序

require 'em-websocket' 

$websocket_clients = [] 

Thread.new do 
    EventMachine.run { 
    EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 8080) do |ws| 
     ws.onopen { 
     $websocket_clients << ws 
     } 

     ws.onclose { 
     $websocket_clients.delete(ws) 
     } 

    end 
    } 
end 

所以我可以在我的控制器使用

$websocket_clients.each do |ws| 
    ws.send "text" 
end 


我現在的問題是:這是好的做法還是我會遇到任何問題

回答

0

這可能會導致問題,當你depoly你的應用程序。在部署應用程序時,通常會分派多個工作進程,每個工作進程處理請求 - 至少在兩個最流行的服務器(Phusion Passenger和獨角獸)中。

每個服務器都會嘗試啓動一個websocket線程。第一個開始順利,下一個可能會崩潰,因爲該端口被第一個阻塞。如果您解決了這個問題,並且您只是使用代碼將消息分發給客戶端,則如上所述,它可能不會造成重大問題。

但是,如果您開始查詢數據庫,只要您未在ActiveRecord中啓用線程安全性,就會出現問題。當您的應用程序的websocket部分變大時,您可以將其放入一個額外的守護進程中,以獨立處理來自服務器進程的請求。