2013-04-01 32 views
9

我想在我的应用程序中利用服务器发送的事件。我正在使用Sinatra和sinatra-sse宝石。这宝石包装Sinatra stream :keep_alive电话。Sinatra与彪马流?

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

回答

3

我相信这个问题围绕着EventMachine库的sinatra-sse的explicit use,它是does not list as a dependency。但是,它确实在其Gemfile中列出了Thin,并且EventMachine是Thin的核心依赖项。

Puma的并发模型是quite different。事实上,你将有权在项目README的顶部找到下面的语句:

彪马吞吐量MRI的允许阻塞IO,同期执行还是改善(基于EventMachine的的服务器,如自动精简关闭此功能,要求你使用特殊的库)。

编辑

如果您有兴趣了解更多关于机架,导轨,彪马和SSE,则可能由Aaron帕特森,一个Ruby/Rails的核心成员,全方位的膨胀享受this great blog post的家伙。

+0

那么,我的应用程序也使用EventMachine,所以我不认为这是由EventMachine没有运行引起的。此外,您链接的特定行似乎只用于在没有数据发送时保持连接打开。我的应用程序定期发送大量数据,所以我认为这与它没有任何关系:/ –

+1

@IlyaO。刚刚编辑了我的答案,并提供了Puma github问题的链接,概述了Puma实施async.callback的障碍。 –

+0

刚刚给票打了个响。如果没有其他人有任何补充,我会给你赏金。 –