2013-04-01 12 views
9

Sto cercando di sfruttare gli eventi inviati dal server nella mia applicazione. Sto usando Sinatra e la gemma sinatra-sse. Questa gemma avvolge la chiamata Sinatra stream :keep_alive.Sinatra in streaming con Puma?

Quando si esegue la mia applicazione su Thin, non ho assolutamente problemi e il flusso degli eventi funziona come previsto. Tuttavia, quando ho acceso la mia applicazione per funzionare con Puma, tutto funziona, tranne il mio sse_stream non fa assolutamente nulla! Restituisce solo una pagina vuota.

mio flusso è configurato in questo modo

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 

sto iniziando sottile in questo modo:

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

Qualsiasi idea di cosa sta succedendo? Qualsiasi aiuto sarebbe apprezzato.

EDIT: un po 'di informazioni Questo è ciò che cURL dà quando viene eseguito su 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 

$ 

considerando che la presente è ciò che accade sul sottile

$ 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> 

EDIT: Vorrei aggiungere che la mia applicazione utilizza EventMachine al suo interno, quindi l'accoppiamento di sinatra_sse a EM non è probabilmente un problema.

risposta

3

Credo che il problema ruota attorno a explicit use di sinatra-sse della libreria EventMachine, che è does not list as a dependency. Tuttavia, elenca Thin nel suo Gemfile e EventMachine è una dipendenza principale di Thin.

Il modello di concorrenza di Puma è quite different. In realtà, troverete la seguente dichiarazione a destra nella parte superiore del README del progetto: i server

Puma migliora ancora il throughput di risonanza magnetica, consentendo il blocco IO da eseguire in concomitanza (EventMachine-based come Thin spegnere la capacità , che richiede l'uso di librerie speciali).

EDIT

Se siete interessati a saperne di più su rack, Rails, Puma, e SSE, si può godere this great blog post da Aaron Patterson, un membro del nucleo di Ruby/Rails e tutto intorno si gonfiano tipo.

+0

Bene, la mia applicazione utilizza anche EventMachine, quindi non penso che questo sia causato da EventMachine non in esecuzione. Anche quella particolare linea che hai collegato sembra essere usata solo per mantenere aperta la connessione per quando non ci sono dati inviati. La mia applicazione invia regolarmente una grande quantità di dati, quindi non credo che abbia nulla a che fare con questo:/ –

+1

@IlyaO. Ho appena modificato la mia risposta con un collegamento a un problema github di Puma che illustra i blocchi stradali per un'implementazione Puma di async.callback. –

+0

Ho appena dato un colpo al biglietto. Ti darò la taglia se nessun altro ha qualcosa da aggiungere. –