2013-04-01 10 views
9

Ich versuche Server-Gesendete Ereignisse in meiner Anwendung zu nutzen. Ich benutze Sinatra und das sinatra-sse Juwel. Dieses Juwel umschließt den Sinatra stream :keep_alive Anruf.Sinatra Streaming mit Puma?

Beim Ausführen meiner Anwendung auf Thin, habe ich absolut keine Probleme, und mein Ereignisstrom funktioniert wie erwartet. Allerdings, als ich meine Anwendung auf Puma umgestellt habe funktioniert alles, außer dass meine sse_stream absolut nichts tut! Es gibt nur eine leere Seite zurück.

ist mein Strom wie so

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 

Ich fange Thin wie so ein:

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

Jede Idee, was los ist? Jede Hilfe wäre willkommen.

EDIT: einige weitere Informationen Dies ist, was cURL gibt, wenn auf 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 

$ 

läuft Während das, was Thin geschieht auf

ist
$ 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: Ich sollte hinzufügen, dass meine Bewerbung eventmachine verwendet in seinem Kern, so sinatra_sse Kopplung an EM ist höchstwahrscheinlich kein Problem.

Antwort

3

Ich glaube, das Problem dreht sich um sinatra-sse explicit use der EventMachine-Bibliothek, die es does not list as a dependency. Es zeigt jedoch Thin in seiner Gemfile und EventMachine ist eine Kernabhängigkeit von Thin.

Das Concurrency-Modell von Puma ist quite different. In der Tat, werden Sie die folgende Anweisung direkt an der Spitze der README des Projekts finden:

Puma noch Durchsatz MRI verbessert, indem IO blockiert gleichzeitig ausgeführt werden (eventmachine-basierten Servern wie Thin diese Fähigkeit deaktivieren Sie müssen spezielle Bibliotheken verwenden).

EDIT

Wenn Sie mehr über Rack-interessiert sind, Rails, Puma, und SSE, könnten Sie this great blog post von Aaron Patterson, Ruby/Rails Kernelement genießen und alles rund um anschwellen Kerl.

+0

Nun, meine Anwendung verwendet EventMachine auch, also glaube ich nicht, dass dies von EventMachine nicht ausgeführt wird. Auch diese bestimmte Linie, die Sie verbunden haben, scheint nur dazu verwendet zu werden, die Verbindung offen zu halten, wenn keine Daten gesendet werden. Meine Anwendung sendet regelmäßig eine großzügige Menge an Daten, also glaube ich nicht, dass das etwas damit zu tun hat:/ –

+1

@IlyaO. Ich habe meine Antwort mit einem Link zu einem Puma-GitHub-Problem bearbeitet, das die Roadblocks für eine Puma-Implementierung von async.callback umreißt. –

+0

Nur gab das Ticket eine Beule. Ich gebe dir das Kopfgeld, wenn niemand etwas hinzuzufügen hat. –