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

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

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

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

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

一些额外的细节:

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

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

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