【问题标题】:How can I retrieve updated records in real-time? (push notifications?)如何实时检索更新的记录? (推送通知?)
【发布时间】:2011-04-06 20:11:10
【问题描述】:

我正在尝试创建一个 ruby​​ on rails 电子商务应用程序,潜在客户将能够在其中下订单,而店主将能够实时接收订单。 最终订单将被记录到数据库中(此时为 SQLite),店主将打开一个浏览器窗口,新订单将在订单完成后立即出现。 (应用信息:我正在使用 HOBO rails 框架,并计划在 Heroku 中托管应用)

我现在正在考虑实现这一点的最佳技术,因为该应用程序预计会有很多用户发送大量订单:

1) 每个浏览器窗口每 X 分钟刷新一次页面,不断轮询服务器以获取新记录(新订单)。当然,这会给服务器带来很大的负担。

2) 同上,但使用某种 AJAX 框架轮询服务器。

3) 使用某种服务器推送技术,例如“comet”异步消息传递。找到了 Juggernaut,唯一的问题是它使用了 Flash 和自定义端口,这可能是个问题,因为我的应用应该可以在公司防火墙和 NAT 之后访问。

4) 我也在检查 node.js 框架,似乎对这种异步消息传递很有效,尽管 Heroku 不支持它。

实现这种功能最有效的方法是什么?是否还有其他我没有想到的方法?

感谢您的宝贵时间和帮助!

【问题讨论】:

    标签: ruby-on-rails ajax comet heroku node.js


    【解决方案1】:

    Node.js 可能是一个不错的选择——它速度快、喜欢实时并且有很好的彗星支持。唯一的缺点是您正在将另一种技术引入您的解决方案。用 tho 编程非常有趣,而且很多库都受到了 rails 和 sinatra 的启发。

    我知道 heroku 运行 node.js 测试版已经有一段时间了,人们将它用作最近的 nodeknockout 竞赛的一部分。 See this blog post。如果这不是一个选项,您绝对可以在其他地方托管它。如果你在 heroku 上托管它,你也许可以代理请求。否则,您可以愉快地在子域上运行它,以便共享 cookie。

    也结帐socket.io。它在根据浏览器的功能选择做彗星的最佳方式方面做得很好。

    要在 node 和 rails 之间共享数据,您可以共享 cookie,然后将会话数据存储在两个应用程序都可以访问的数据库中。更复杂的架构可能涉及使用 Redis 在它们之间发布消息。或者,您也许可以在 http 请求中传递您需要的所有内容。

    【讨论】:

      【解决方案2】:

      实际上,如果您让店主运行 Chrome(其他浏览器将很快跟进),您可以使用 WebSockets(虽然只是为了店主的通知),它允许您持续打开连接,您可以将数据发送到没有浏览器请求任何东西的浏览器。

      有一些用于 node.js 的 websocket 库,但我相信您只需使用常规 tcp 连接即可轻松完成。

      【讨论】:

        【解决方案3】:

        在 HTTP 中,请求只能来自客户端。因此,最好的选择是您已经提到的(轮询和 HTTP 流)。

        轮询是更容易实现的选项;虽然它会使用相当多的带宽。这就是为什么您应该使请求和响应尽可能小,因此您绝对应该为此使用 XHR (Ajax)。

        您的另一个选择是 HTTP 流式传输(彗星);这将需要更多的设置工作,但您可能会发现它值得付出努力。您可以试一试Realtime on Rails。有关如何减少带宽使用的更多信息和提示,请参阅:

        http://ajaxpatterns.org/Periodic_Refresh
        http://ajaxpatterns.org/HTTP_Streaming

        【讨论】:

        • 您好,感谢您的回复。我认为 http 流(彗星)更适合我的应用程序,因为我希望店主整天都在他们的浏览器前等待订单。如果我使用轮询,这可能会给服务器带来很大的负担。那么如何将 Comet 服务器(如 node.js 和 Ajax Push Engine)与我现有的 Ruby on Rails 应用程序集成?这是否意味着我应该为安装彗星服务器的另一个 linux 主机服务(heroku 除外)付费?你怎么看?谢谢!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-18
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-08
        相关资源
        最近更新 更多