对于我的Rails-App,如果上传了新数据,我需要调用所有连接的客户端。所以我想使用websockets。目前,我已经在initializers中创建了一个新文件,它在一个新线程中启动套接字服务器:
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在我的控制器里。
我现在的问题是:这是一个很好的实践吗?我会遇到什么问题吗?
发布于 2012-08-02 07:04:39
这可能会在您解除应用程序的多点操作时出现问题。在部署应用程序时,通常会派生多个工作进程,每个工作进程处理请求-至少在两个最流行的服务器(Phusion Passenger和unicorn)中是这样。
每台服务器都会尝试启动一个websocket线程。第一个可以顺利启动,下一个可能会崩溃,因为端口被第一个阻塞了。如果您修复了这个问题,并且您只是使用代码将消息分发到客户端,如上面所述,它可能会正常工作,而不会出现大的问题。
但是,如果您开始查询数据库,只要不在ActiveRecord中启用线程安全,就会出现问题。当应用程序的websocket部分变得更大时,您可以将其放入一个额外的守护进程中,该守护进程独立于服务器进程处理请求。
https://stackoverflow.com/questions/11767486
复制相似问题