1

我试图获得一个在我运行我的 rails 服务器时运行的 EventMachine 服务器,而不是作为一个单独的进程。

因此,例如,使用此处的简单服务器示例(em-websocket),您将获得以下(独立?)ruby 代码:

EventMachine.run {

EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 8080) do |ws|
    ws.onopen {
      puts "WebSocket connection open"

      # publish message to the client
      ws.send "Hello Client"
    }

    ws.onclose { puts "Connection closed" }
    ws.onmessage { |msg|
      puts "Recieved message: #{msg}"
      ws.send "Pong: #{msg}"
    }
end
}

假设我刚刚运行了命令“rails new em-example”,上面的代码在我的 rails 3 应用程序中的什么位置?

我想上面的代码应该理想地在一个单独的线程(或光纤..?)中运行,但我不确定它看起来如何。

我已经看到如果使用“瘦”作为我的网络服务器,这应该很容易。Heroku 似乎默认使用它,我已经安装了“瘦”gem,所以我也可以在本地对其进行测试。

4

1 回答 1

1

您可能希望将代码放入初始化程序中。John Nunemaker 发布了一些关于在 Sinatra 应用程序中的 Passenger 下启动 EventMachine 的非常有趣的信息,我想它对您的工作方式非常相似。

也就是说,听起来您只是想让一个 Web 套接字服务器与 Heroku 一起工作。理论上,您会认为在 Cedar 堆栈上运行并向您的 Procfile 中为您的基于 EM 的 Websockets 服务器添加一个新的进程类型会使其正常工作。这看起来像:

web:         bundle exec rails server -p $PORT
websocket:   bundle exec script/websocket_server $PORT

使用 script/websocket_server 作为您的应用程序的套接字服务器脚本,可以处理自定义端口参数。

不幸的是,Heroku 还不支持 Websockets,如此处所述因此 Procfile 解决方案很可能无法工作。

于 2011-12-17T03:52:25.207 回答