Sinatra与Puma合作?

时间:2013-04-01 18:32:20

标签: ruby sinatra rack thin puma

我正在尝试在我的应用程序中利用Server-Sent Events。我正在使用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

$

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

1 个答案:

答案 0 :(得分:3)

我认为这个问题围绕着Sinatra-sse的explicit use EventMachine库,does not list as a dependency。但是,它确实列出了Gemfile中的Thin,而EventMachine是Thin的核心依赖项。

Puma的并发模型是quite different。实际上,您会在项目README的顶部找到以下声明:

  

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

修改

如果您有兴趣了解有关Rack,Rails,Puma和SSE的更多信息,您可能会感受到来自Aaron Patterson的this great blog post,这是一个Ruby / Rails核心成员和全能的人。