11

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

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

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

有什么例子吗?

此外,我通常在 nginx 反向代理后面运行 Rails 应用程序服务器。它需要任何特定的设置吗?

4

1 回答 1

3

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

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

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

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

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

于 2013-10-10T12:55:33.390 回答