5

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

我考虑过使用延迟作业在用户线程之外处理这个问题,但这似乎不太适合用例。由于用户需要等到处理完成才能看到结果,而延迟作业可能需要长达五秒钟的时间才能开始作业,所以我不能保证处理会尽快发生。不幸的是,在这种情况下,这个等待时间是不可接受的。

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

  • 用户点击书签
  • 数据被发送到服务器进行处理
  • 在关闭线程进行处理时立即返回等待页面
  • 等待页面通过 ajax 定期轮询处理结果并更新等待页面(例如:“4 of 567 URLs processed...”)
  • 等待页面在结果准备好后更新

一些额外的细节:

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

这是执行此操作的典型方法,还是有更好的方法?我应该只是滚动我自己的线程外处理,在处理过程中更新数据库,还是有类似延迟作业之类的东西可以用于此(并且适用于 Heroku)?任何朝着正确方向的推动都将不胜感激。

4

1 回答 1

1

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

于 2010-11-09T21:59:42.607 回答