【问题标题】:Sinatra streaming with Puma?Sinatra 与 Puma 合作?
【发布时间】:2013-03-22 20:59:36
【问题描述】:

我正在尝试在我的应用程序中利用服务器发送的事件。我正在使用 Sinatra 和 sinatra-sse gem。这个 gem 封装了 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 的耦合很可能不是问题。

【问题讨论】:

    标签: ruby sinatra rack thin puma


    【解决方案1】:

    我相信这个问题围绕着 EventMachine 库的 sinatra-sse 的 explicit use,它是 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 核心成员和全能的大佬。

    【讨论】:

    • 嗯,我的应用程序也使用了 EventMachine,所以我不认为这是由于 EventMachine 没有运行造成的。此外,您链接的那条特定线路似乎仅用于在没有发送数据时保持连接打开。我的应用程序定期发送大量数据,所以我认为这与它没有任何关系:/
    • @IlyaO。刚刚编辑了我的答案,其中包含指向 Puma github 问题的链接,其中概述了 Puma 实现 async.callback 的障碍。
    • 刚刚把票撞了。如果没有其他人可以添加任何东西,我会给你赏金。
    猜你喜欢
    • 2021-08-17
    • 2015-07-23
    • 2021-01-14
    • 2019-03-25
    • 1970-01-01
    • 2019-06-07
    • 2014-01-24
    • 2015-01-19
    • 2017-12-25
    相关资源
    最近更新 更多