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

mar*_*ada 5 ruby-on-rails long-running-processes delayed-job ruby-on-rails-3

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

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

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

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

一些额外的细节:

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

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

Ben*_*Lee 1

我认为你的后一个想法最有道理。我只是将每个 url 检查的处理卸载到其自己的线程(因此所有 url 检查同时运行——无论如何,这应该比顺序检查快得多)。当每个线程完成时,它都会更新数据库(确保线程不会干扰彼此的写入)。AJAX 端点(正如您所说,您在客户端定期轮询)将从数据库获取并返回已完成进程的计数。这是一个足够简单的方法,我真的认为不需要任何额外的组件。