2012-08-01 51 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部分变大时,您可以将其放入一个额外的守护进程中,以独立处理来自服务器进程的请求。