服务器发送事件和Rails流

tom*_*ave 11 ruby ruby-on-rails nginx server-sent-events puma

我正在尝试使用Rails 4 ActionController::Live和Server Sent Events.我正在使用MRI 2.0.0和Puma.

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

Puma使用线程管理多个连接,我想cuncurrent连接的数量是有限的.
如果我想支持数以千计的客户注册到我的Rails应用程序进行SSE事件的真实场景,该怎么办?

有什么例子吗?

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

Mat*_*son 3

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

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

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

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

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