4

我正在寻找一种在 Rails 应用程序(Phusion 乘客服务器)上为我的用户实现实时提要的好方法。每个提要可能因用户而异,我希望每 20 到 60 秒会有一个新项目。定期 ajax 请求对我来说似乎不是最好的方法。

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

这有什么问题吗?有没有更简单更好的方法来做到这一点?

谢谢,S。

4

2 回答 2

4

就 Web 应用程序(以及扩展的 Rails 应用程序)而言,实时只是一种幻觉。长轮询是一个非常接近的近似值。不幸的是,它不太适合 Rails。乘客更是如此。

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

我个人对长轮询的看法是它是一个需要问题的解决方案。

真的,您应该问自己以下问题:

  • 这些更新是否具有足够高的优先级以至于它们不能等待 40 秒?
  • 如果没有立即收到更新会怎样?
  • 我的用户是否会如此专注于我的应用程序,以至于等待 15 秒会对他们的体验产生负面影响?
  • 在正常使用情况下,我的应用程序吸引了多少百分比的用户注意力?
  • 响应更新需要多长时间?
  • 真的需要实时吗?

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

我想你明白我的意思:实时更新非常好,但从来没有必要。如果您正在做的事情是无法对实时更新做出反应的后果就是世界末日。你真的不应该把它开发成一个 Web 应用程序。

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

于 2009-11-05T18:37:15.933 回答
4

Friendfeed 用他们开源的 Python构建了Tornado 服务器。

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

这篇关于 nginx 模块的博客文章和一个 ruby​​ 示例应该可以帮助您入门(必须编译 nginx)。我们现在正在开发中运行它,并计划在生产中使用它,除非它证明自己不可靠,到目前为止还不错。

于 2009-11-06T06:10:01.423 回答