Синатра стримит с Puma?

Я пытаюсь использовать события, отправленные сервером, в своем приложении. Я использую Sinatra и гем sinatra-sse. Этот драгоценный камень является оберткой для вызова Sinatra stream :keep_alive.

При запуске моего приложения на Thin у меня нет абсолютно никаких проблем, и мой поток событий работает так, как ожидалось. Однако, когда я переключил свое приложение на работу с Puma, все работает, за исключением того, что мой sse_stream абсолютно ничего не делает! Он просто возвращает пустую страницу.

Мой поток настроен так

get "/logstream/:server" do
    if rbcserver = MyApp.servers[params[:server]]
        sse_stream do |stream|     
            rbcserver.add_web_logger(stream)
            stream.callback { rbcserver.remove_web_logger(stream) }
        end
    else
        error 404
    end
end

Я начинаю тонкий так:

@@puma_instance = Puma::Server.new MyApp::WebUI
@@puma_instance.add_tcp_listener ip, port
@@puma_instance.run

Есть идеи, что происходит? Любая помощь будет оценена по достоинству.

РЕДАКТИРОВАТЬ: еще немного информации. Это то, что дает cURL при работе на Puma.

$ curl -L -b cookies.txt -c cookies.txt -i http://localhost:9001/logstream/myserver    
HTTP/1.1 200 OK
Content-Type: text/event-stream;charset=utf-8
X-Content-Type-Options: nosniff
Transfer-Encoding: chunked

$

Принимая во внимание, что это то, что происходит на тонком

$ curl -L -b cookies.txt -c cookies.txt -i http://localhost:9001/logstream/myserver                                        
HTTP/1.1 200 OK
Content-Type: text/event-stream;charset=utf-8
X-Content-Type-Options: nosniff
Connection: close
Server: thin 1.5.1 codename Straight Razor

event: <event name>
data: <my data>

event: <event name>
data: <my data>

<continues as more data comes in>

РЕДАКТИРОВАТЬ: я должен добавить, что мое приложение использует EventMachine в своей основе, поэтому связь sinatra_sse с EM, скорее всего, не является проблемой.


person Ilya O.    schedule 01.04.2013    source источник


Ответы (1)


Я считаю, что проблема связана с явным использование библиотеки EventMachine, которая не указан как зависимость. Однако Thin указан в его Gemfile и EventMachine. является основной зависимостью Thin.

Модель параллелизма Puma совершенно отличается. Фактически, вы найдете следующее утверждение прямо в верхней части README проекта. :

Puma по-прежнему улучшает пропускную способность MRI, позволяя одновременно выполнять блокировку ввода-вывода (серверы на основе EventMachine, такие как Thin, отключают эту возможность, требуя от вас использования специальных библиотек).

ИЗМЕНИТЬ

Если вам интересно узнать больше о Rack, Rails, Puma и SSE, вам может понравиться отличный пост в блоге, написанный Аароном Паттерсоном, одним из основных участников Ruby/Rails и отличным парнем.

person ezkl    schedule 10.04.2013
comment
Что ж, мое приложение также использует EventMachine, поэтому я не думаю, что это вызвано тем, что EventMachine не запущен. Кроме того, эта конкретная строка, которую вы связали, по-видимому, используется только для того, чтобы поддерживать соединение открытым, когда данные не отправляются. Мое приложение регулярно отправляет большое количество данных, поэтому я не думаю, что это имеет к этому какое-то отношение:/ - person Ilya O.; 10.04.2013
comment
@ИльяО. Только что отредактировал мой ответ со ссылкой на проблему github Puma с описанием препятствий для реализации Puma async.callback. - person ezkl; 10.04.2013
comment
Просто дал билет удар. Я дам вам награду, если никто больше не может что-то добавить. - person Ilya O.; 10.04.2013