使用Rails实时

时间:2009-11-05 16:13:04

标签: ruby-on-rails passenger real-time

我正在寻找一种在Rails应用程序(Phusion乘客服务器)上为我的用户实现实时Feed的好方法。根据用户的不同,每种饲料可能会有所不同,我希望每20到60年就有一个新产品。定期的ajax请求看起来不是为我做的最佳方式。

我听说过Comet,我想过有这样的事情: - 使用XMLHttpRequest长轮询等待来自服务器的ping - 服务器发送ping请求后,使用ajax发送最新项目 - 启动另一个XMLHttpRequest

这有什么问题吗?是否有更容易和更好的方法来做到这一点?

谢谢, S上。

2 个答案:

答案 0 :(得分:4)

在Web应用程序(以及扩展的Rails应用程序)方面,实时只是一种幻觉。长轮询是非常接近的近似。不幸的是,它不适合Rails。对乘客来说更是如此。

长轮询需要为每个用户提供持久的开放连接,这种连接在非设计用于处理它的服务器上(例如Apache)不能进行扩展。不幸的是,有很多服务器专为长轮询可扩展性而设计,可以很好地与Rails配合使用。您可以尝试使用Shooting-Star服务器,但我真的不知道它的性能与Passenger相比如何与您的标准请求相比。

我对长期民意调查的个人看法是需要解决问题的解决方案。

你真的应该问自己以下问题:

  • 这些更新的优先级是否足以让他们无法等待40秒?
  • 如果没有立即收到更新会怎样?
  • 我的用户是否会专注于我的应用程序,等待15秒会对他们的体验产生负面影响?
  • 我的应用在正常使用情况下吸引了多大比例的用户注意力?
  • 回复更新需要多长时间?
  • 真的是否需要实时?

其中一些问题以不同的方式提出其他问题,但这对于这些主观问题来说是必要的。

我认为你看到了我所得到的:实时更新非常好,但从来没有真正必要。如果你正在研究那些未能对实时更新做出反应的结果是世界末日的事情。你真的不应该把它作为一个Web应用程序开发。

如果您仍然关注实时更新,可以查看Juggernaut。但这是一个基于Flash的解决方案。

答案 1 :(得分:4)

Friendfeed在Python中构建了Tornado server,他们已经开源了。

在使用nginx_http_push_module之前,我们查看了一些设置相当复杂的XMPP选项。长期存在的HTTP GET请求连接到此,rails应用程序将请求返回到nginx。 Nginx还代理对一组mongrel的动态请求。我们有一些jQuery运行,它会打开连接,然后在收到消息时或者出现错误时重新打开它到服务器。通过这种方式,我们可以实现Comet风格的近实时更新。

这个blog post on the nginx module with a ruby example应该可以帮助你入门(必须编译nginx)。我们现在正在开发这个并计划在生产中使用它,除非它证明自己不可靠,到目前为止一直很好。