1

Извините. Мой английский не очень хорош ....Сервер-отправленные события с 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 в клиенте пытается повторно подключиться.

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

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

ответ

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-сценария односекундный сон является нормальным.