9

我正在尝试在我的应用程序中利用服务器发送的事件。我正在使用 Sinatra 和sinatra-ssegem。这个 gem 包装了 Sinatrastream :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

$

而这就是 Thin 上发生的事情

$ 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 的耦合很可能不是问题。

4

1 回答 1

3

我认为问题在于 sinatra-sse明确使用EventMachine 库,它没有将其列为依赖项。但是,它确实在其Gemfile中列出了 Thin并且 EventMachine 是Thin的核心依赖项。

Puma 的并发模型完全不同。事实上,您会在项目的README顶部找到以下语句:

Puma 仍然通过允许并行运行阻塞 IO 来提高 MRI 的吞吐量(基于 EventMachine 的服务器,例如 Thin 关闭了此功能,需要您使用特殊的库)。

编辑

如果您有兴趣了解有关 Rack、Rails、Puma 和 SSE 的更多信息,您可能会喜欢Aaron Patterson 的这篇精彩的博客文章,他是 Ruby/Rails 的核心成员和全能的家伙。

于 2013-04-10T09:53:06.090 回答