服务器发送事件和Rails流

时间:2013-09-03 12:53:55

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

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

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

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

有什么例子吗?

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

1 个答案:

答案 0 :(得分:3)

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

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

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

“运行基准”是唯一的答案。

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