使用PUMA或Passenger的服务器发送事件

时间:2015-03-30 07:34:38

标签: multithreading ruby-on-rails-4 passenger server-sent-events puma

一开始很抱歉。我的英语不好......

我正在尝试Rails4中的服务器发送事件(Ruby on Rails)。

  

sse_controller.rb

 def test_sse
    response.headers['Content-Type'] = 'text/event-stream'
    sse = SSE.new(response.stream)
    puts 'New SSE = '+sse.to_s

    begin
      loop do
        sse.write({ nowtimes: Time.new}, event: 'timer')
      end
    ensure
      sse.close
    end
 end
  

mypage.html.erb

$(document).ready(function(){
    var evtSource   = new EventSource("/sse/test_sse");
    evtSource.addEventListener('timer', function(e) {
        obj = JSON.parse(e.data);
        console.log(obj.nowtimes);
    });
})

我使用NGINX作为我的网络服务器。

  1. 我使用 Passenger 作为我的应用服务器。它工作得很好,但不能支持多线程。它只能同时打开6个标签。

  2. 当我尝试 PUMA 作为我的应用服务器时,它的工作很奇怪。客户端的SSE正在尝试不间断地重新连接。

  3. 如果我使用Passenger,我应该如何解决有关连接数的问题?

    或者如果我使用PUMA,我应该如何解决重新连接的循环?

1 个答案:

答案 0 :(得分:2)

首先,基于此我不会使用PUMA作为应用服务器。 Passenger表现正常:6 tab限制是浏览器连接限制。如果你并排浏览Chrome和Firefox,你应该可以获得12个连接。

请参阅http://www.browserscope.org/?category=network&v=1处的每个主机名的连接列 (有关如何自定义连接限制的一些信息,请访问:https://stackoverflow.com/a/16855830/841830

顺便问一下,你的loop do ... end不应该睡觉吗?否则它将如此快地抽出SSE消息,浏览器将无法跟上。在这种测试SSE脚本中,一秒睡眠是正常的。