1

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

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

4

1 回答 1

0

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

每个服务器都会尝试启动一个 websocket 线程。第一个启动顺利,下一个可能会崩溃,因为端口被第一个阻塞。如果您解决了这个问题,并且您只是使用代码将消息分发给客户端,如上所述,它可能会正常工作而不会出现重大问题。

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

于 2012-08-01T23:04:39.390 回答