对于我的Rails-App我需要在上传新数据时调用所有连接的客户端。所以我想使用websockets。目前我在初始化器中创建了一个新文件,它在一个新线程中启动套接字服务器:
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 :(得分:0)
解密您的应用程序时,这可能会导致问题。部署应用程序时,通常会分配多个处理请求的工作进程 - 至少在两个最常用的服务器(Phusion Passenger和unicorn)中。
每个服务器都会尝试启动websocket线程。第一个开始顺利,下一个可能会崩溃,因为端口被第一个阻塞。如果您解决了这个问题并且您只是使用代码将消息分发给客户端,如上所述,它可能会在没有重大问题的情况下运行。
但是,如果您开始查询数据库,只要您没有在ActiveRecord中启用线程安全,就会出现问题。当应用程序的websocket部分变大时,您可以将其放入一个额外的守护程序中,该守护程序单独处理来自服务器进程的请求。