【问题标题】:Server Sent Events and Rails Streaming服务器发送事件和 Rails 流
【发布时间】:2013-09-03 12:53:54
【问题描述】:

我正在试验 Rails 4 ActionController::Live 和服务器发送事件。我正在使用 MRI 2.0.0 和 Puma。

就我所见,每个连接的客户端都与服务器保持活动连接。我想知道是否可以在不保持所有响应流运行的情况下利用 SSE。

Puma 使用线程管理多个连接,我想当前连接的数量是有限制的。
如果我想支持一个真实世界的场景,成千上万的客户注册到我的 Rails 应用程序以进行 SSE 事件?

有例子吗?

另外,我通常在 nginx 反向代理后面运行 Rails 应用服务器。是否需要任何特殊设置?

【问题讨论】:

    标签: ruby-on-rails ruby nginx server-sent-events puma


    【解决方案1】:

    构建 SSE 的方式是客户端打开与服务器的连接,然后保持打开状态,直到服务器有一些数据要发送。这是 SSE 规范的一部分,而不是特定于 ActionController::Live 的东西。它实际上与长轮询相同,但在返回第一位数据后连接不会关闭,并且具有浏览器内置的机制。

    因此,实现它的唯一方法是让多个开放的客户端连接到无限期地坐在那里的网络服务器。至于处理它们需要哪些资源,我不确定,因为我还没有尝试对此进行基准测试,但如果你有这么多用户,它需要足够的服务器让 Puma 保持打开数千个连接打开一个页面。

    puma 的默认限制是 16 个并发连接。几篇关于为 Rails 设置 SSE 的博客文章都提到了将这个值提高到一个更大的值,但我发现没有一个表明这个更高的值应该是什么。他们确实提到数据库连接的数量需要相同,因为每个 Rails 线程保持一个运行。听起来像是一种昂贵的运行方式。

    “运行基准测试”确实是唯一的答案。

    我无法评论反向代理,因为我没有尝试过,但由于 SSE 是通过标准 HTTP 完成的,我不认为它需要任何特殊设置。

    【讨论】:

    • 我没有运行基准测试,但最终我以未准备好生产为由驳回了该尝试。恐怕对于这类场景,我们需要使用事件模型。
    • 确认:每个客户端(和 SSE 流)都需要一个持久的 HTTP 连接(一个 Puma 线程)。反过来,每个 HTTP 连接都需要一个 DB 连接(如果您使用的是 DB)。它适用于小型应用程序,但不适用于大规模应用程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 2017-07-22
    • 2013-01-11
    相关资源
    最近更新 更多