在用户等待时处理大量数据的最佳实践(在Rails中)?

时间:2010-11-09 20:57:20

标签: ruby-on-rails ruby-on-rails-3 delayed-job long-running-processes

我有一个bookmarklet,当使用时,将当前浏览器页面上的所有URL提交给Rails 3应用程序进行处理。我正在使用Typhoeus检查每个URL是否返回2XX状态代码。目前,我通过对Rails服务器的AJAX请求启动此过程,只需等待它处理并返回结果。对于一个小集合,这非常快,但是当URL的数量非常大时,用户可以等待,例如10-15秒。

我考虑使用延迟作业在用户的线程之外处理它,但这似乎不是正确的用例。由于用户需要等到处理完成才能看到结果,并且延迟作业可能需要在作业开始之前最多五秒钟,我不能保证处理将尽快发生。不幸的是,在这种情况下,这个等待时间是不可接受的。

理想情况下,我认为应该发生的是:

  • 用户点击书签
  • 将数据发送到服务器进行处理
  • 在旋转线程进行处理时立即返回等待页面
  • 等待页面定期通过ajax轮询处理结果并更新等待页面(例如:“处理过的567个URL中的4个...”)
  • 等待页面一旦准备好就会更新结果

一些额外的细节:

  • 我正在使用Heroku(长时间运行的进程在30秒后被杀死)
  • 登录和匿名用户都可以使用此功能

这是一种典型的方法,还是有更好的方法?我应该只是在处理过程中滚动自己的线程外处理来更新数据库,还是可以使用像我这样的延迟作业(这适用于Heroku)?任何推动正确方向的人都会非常感激。

1 个答案:

答案 0 :(得分:1)

我认为你的后一个想法最有意义。我只是将每个url-check的处理卸载到它自己的线程(所以所有的url检查同时运行 - 这应该比顺序检查要快得多)。每次完成时,它都会更新数据库(确保线程不会互相踩踏)。 AJAX端点 - 正如您所说,您在客户端定期轮询 - 将从数据库中获取并返回已完成进程的计数。这是一个简单的方法,我真的不需要任何额外的组件。