Server-Sent-Events с PUMA или Passenger

Сначала извини. Мой английский не очень хорош....

Я пытаюсь отправлять события сервера в 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

моя страница.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 в клиенте пытается переподключиться без перерыва.

Если я использую Passenger, как мне решить проблему с номером соединения?

Или, если я использую PUMA, как мне разрешить цикл повторного подключения?


person Isha Huang    schedule 30.03.2015    source источник


Ответы (1)


Во-первых, исходя из этого, я бы не стал использовать PUMA в качестве сервера приложений. Пассажир ведет себя корректно: ограничение в 6 вкладок — это ограничение на подключение браузера. Если вы попробуете использовать Chrome и Firefox одновременно, вы сможете получить 12 подключений.

См. столбец подключений на имя хоста по адресу http://www.browserscope.org/?category=network&v=1 (и некоторая информация о том, как настроить лимит подключения, находится здесь: https://stackoverflow.com/a/16855830/841830 )

Кстати, а не поспать ли тебе в loop do ... end ? В противном случае он будет выдавать сообщения SSE так быстро, что браузер не сможет успевать за ними. В таком тестовом SSE-скрипте односекундный сон — это нормально.

person Darren Cook    schedule 31.03.2015