对选择 Faye 或 Rails 4 Actioncontroller::Live 的困惑

Posted

技术标签:

【中文标题】对选择 Faye 或 Rails 4 Actioncontroller::Live 的困惑【英文标题】:Confusion over choosing Faye or Rails 4 Actioncontroller::Live 【发布时间】:2014-04-05 04:32:35 【问题描述】:

我已经将 Faye 与 Ruby On Rails 一起使用,这对我来说几乎是 0 成本,因为我在连接到我的 Rails 应用程序的另一台服务器上运行 Faye。

但是我遇到了一些问题,比如在 Rails 服务器上查询时间过长,一段时间后 Faye 连接会失败并引发异常。

现在我正在研究 Actioncontroller::Live ,大多数实现都使用 Redis,这对我的创业公司来说有点贵,但是我意识到我不能用 Actioncontroller 做订阅/发布风格的事情::直播。

我的问题:我应该转到 Actioncontroller::Live 还是坚持 Faye ?虽然这些是我想要完成的事情:

    评论/提要后更新 通知系统,基于pub/sub,类似于Faye。 异常处理 可扩展性 > 更多用户更多连接

我知道 Faye 使用 Bayeux 而 ActionController::live 使用 SSE/HTTP。 我应该考虑与 Socket.IO 相关的任何事情吗? SockJS ?

我已经阅读了有关此主题的一些问题,例如: Replace Faye with rails 4 server side events? Faye VS rails 4 streaming? 但我需要更多信息:

【问题讨论】:

【参考方案1】:

以下是关于我为什么会坚持使用 Faye 的一些说明,这可能会让您更接近这个问题的答案:

浏览器兼容性

正如您在相关的 *** 问题中看到的,Faye 具有更好的浏览器兼容性。

稳定性

Rails::Live 功能似乎还不是很稳定。 Rails SSE 目前正在积极开发。例如,您不太可能不会受到this issue 的影响。

线程&阻塞 vs 异步非阻塞

您在应用程序中使用多线程吗?如果你不这样做,我绝对不会只为 Rails::Live 引入它,因为它打开了非线程安全 gem 问题的可能性和服务器选择的限制。

如果您确实有多线程,则每个客户端都会为您的应用程序保持一个线程。如果您的线程用完,您的应用程序将无响应/死机。考虑一下您需要多少线程来满足用户打开多个浏览器选项卡的高峰时间,甚至是 DOS 攻击,其中有人打开大量空闲的 SSE/websocket 连接以达到您的最大值并关闭您的应用程序。如果您设置大量的最大线程来支持许多空闲连接,那么您就有可能拥有这么多非空闲线程,这可能会产生它自己的问题。没有 SSE/websockets 和没有彗星/长轮询对于阻止应用程序要安全得多。据我了解,您的设置单独运行 Faye。 Faye 服务器运行 Ruby EventMachine 或 Node.js,它们都是异步非阻塞的,并且不为每个打开的连接使用线程。它可以毫无问题地处理大量并发连接。

我的观点是,一个普通的阻塞式 Rails Web 应用程序具有一个单独的异步非阻塞服务器,用于保持打开的连接(传递消息并使应用程序运行)是这两种设置中最好的。这就是 Rails + Faye 所拥有的。

更新:Actioncable 在 Railsconf 2015 上宣布。如上所述,它以非阻塞方式运行,但它是集成的官方 Rails 解决方案。拥有一个拥有庞大社区的单一框架,一个集成的非阻塞 websocket 连接处理程序,您可以在一切“开箱即用”的情况下单独运行和配置,这是 Rails 的一大优势。

来自 Action Cable 自述文件Action Cable 由 EventMachine 和线程的组合驱动。连接处理所需的框架管道在 EventMachine 循环中处理,但用户指定的实际通道工作在普通 Ruby 线程中处理。这意味着您可以毫无问题地使用所有常规 Rails 模型,只要您没有犯任何线程安全问题。

要了解更多信息,您可以阅读ActionCable & Underlying architecture。

【讨论】:

非常感谢您在回答时充满信心。我也决定走这条路。如果我选择其他方式而不是 Faye + Rails,我意识到安全风险和停机问题。再次感谢 :),不久后我打算写一篇关于此的博客,并请务必使用您的答案作为证据 :)! 那篇博客是你写的吗?有机会给个链接吗? 我同意最后一段。尽管 Node.js 大肆宣传,Rails 仍然是最佳选择。

以上是关于对选择 Faye 或 Rails 4 Actioncontroller::Live 的困惑的主要内容,如果未能解决你的问题,请参考以下文章

Rails - 同步 - Faye、Juggernaut、Cool.io、普通的旧事件机器

将 Nodejs Faye-Client 连接到 Rails Faye 服务器

Rails 4 和 ActionCable

Faye Websocket 错误 Rails 2.2.2(生产)

Websocket rails (Faye-websocket) 握手错误代码 200 - AWS ElasticBeanstalk、nginx、puma

通过 Faye 在 Rails 应用程序上进行实时聊天,但通过 Apache 在乘客上进行实时聊天