如何实时检索更新的记录? (推送通知?)

时间:2010-09-01 14:04:24

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

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

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

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

2)如上所述,但是使用某种AJAX框架轮询服务器。

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

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

哪种方法是实现此类功能的最有效方法?还有其他方法我没有想过吗?

感谢您的时间和帮助!

3 个答案:

答案 0 :(得分:3)

Node.js可能非常适合 - 它很快,喜欢实时并且有很棒的彗星支持。唯一的缺点是您在解决方案中引入了另一种技术。在这个程序中进行编程非常有趣,很多库都受到了rails和sinatra的启发。

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

同时结帐socket.io。根据浏览器的功能,它可以很好地选择最佳的彗星方式。

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

答案 1 :(得分:1)

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

轮询是更容易实施的选择;它会使用相当多的带宽。这就是为什么你应该保持请求和响应尽可能小,所以你一定要使用XHR(Ajax)。

你的另一个选择是HTTP流媒体(Comet);它需要更多的设置工作,但你可能会觉得值得付出努力。你可以给Realtime on Rails一个机会。有关如何减少带宽使用的更多信息和提示,请参阅:

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

答案 2 :(得分:0)

实际上,如果您的店主运行Chrome(其他浏览器即将推出),您可以使用WebSockets(仅用于店主的通知),这样您就可以打开常量连接,并且可以将数据发送到没有浏览器请求任何内容的浏览器。

node.js有一些websocket库,但我相信你可以使用常规的tcp连接轻松完成。