我正在尝试在我的应用程序中利用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的耦合很可能不是问题。
答案 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核心成员和全能的人。