2013-04-01 30 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

剛剛給票打了個響。如果沒有其他人有任何補充,我會給你賞金。 –