使用rails应用程序启动em-websocket是不错的做法

时间:2012-08-01 20:58:15

标签: ruby-on-rails ruby websocket

对于我的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

在我的控制器中。
我现在的问题是:这是一个好的做法,还是我会遇到任何问题

1 个答案:

答案 0 :(得分:0)

解密您的应用程序时,这可能会导致问题。部署应用程序时,通常会分配多个处理请求的工作进程 - 至少在两个最常用的服务器(Phusion Passenger和unicorn)中。

每个服务器都会尝试启动websocket线程。第一个开始顺利,下一个可能会崩溃,因为端口被第一个阻塞。如果您解决了这个问题并且您只是使用代码将消息分发给客户端,如上所述,它可能会在没有重大问题的情况下运行。

但是,如果您开始查询数据库,只要您没有在ActiveRecord中启用线程安全,就会出现问题。当应用程序的websocket部分变大时,您可以将其放入一个额外的守护程序中,该守护程序单独处理来自服务器进程的请求。