2017-03-09 59 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反應器。