2017-03-09 60 views
0

我有一个运行Puma的Ruby应用程序。现在我想添加一个websocket来向连接的客户端广播REST请求。我设法只是在我config.ru加入一些代码来创建与EM-的WebSocket创业板的WebSocket服务器:添加em-websocket到我的Puma应用程序

require_relative 'config/environment' 

require 'em-websocket' 

Socket = EM.run { 

    @channel = EM::Channel.new 

    EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 2929, :debug => true) do |ws| 

    ws.onopen { 
     sid = @channel.subscribe { |msg| ws.send msg } 
     @channel.push "#{sid} connected!" 

     ws.onmessage { |msg| 
     @channel.push "blubb" 
     } 

     ws.onclose { 
     @channel.unsubscribe(sid) 
     } 
    } 

    end 
} 

run Rails.application 

现在的问题是,当我运行“轨道服务器-b 0.0.0.0” WebSocket的是运行但我的应用程序不是。当连接到本地主机:3000我得到一个时间。 我能做些什么来运行它们?

后续问题:如何通过websocket向连接的客户端进行广播?我想添加到REST的控制器请求广播方法。那可能吗?

回答

0

兼得Rails的HTTP和WebSocket的服务共享同一端口,你有两种选择,我知道的:

  1. 您可以设置使用代理端口(也许nginx的)和前锋各请求它的各自的应用程序服务器(即Puma和EM)。

  2. 可以使用的WebSocket + HTTP服务器,并为您的HTTP内的中间件上运行的WebSockets服务(Rails)的应用程序(即使用ActionCable,王菲或iodine + plezi)。

我假设第二个解决方案是更包容,但它会要求你从em-websockets你的代码移植到其他的解决方案(即王菲或碘/ Plezi)。

我应该注意基准测试表明em-websocket might break down under stress, over-exhausting the CPU

我是Iodine的作者,所以我有偏见,我认为这是比大多数Ruby替代品更好的解决方案(和一些benchmarks同意)。碘利用the proposed (and probably abandoned) Rack-Websocket specification,所以HTTP和Websocket连接共享相同的服务器和IO反应器,从而实现更好的资源管理。但是,您也可以使用Faye,它与HTTP服务器(类似于当前的ActionCable实现)劫持套接字,并在建立WebSocket连接后将其连接到单独的IO反应器。