【问题标题】:How to make multiple parallel concurrent requests with Rails and Heroku如何使用 Rails 和 Heroku 发出多个并行并发请求
【发布时间】:2017-12-19 04:17:01
【问题描述】:

我目前正在开发一个 Rails 应用程序,该应用程序将一长串链接作为输入,使用后台工作程序 (Resque) 抓取它们,然后将结果提供给用户。但是,在某些情况下,有许多 URL,我希望能够并行/并发地发出多个请求,这样会花费更少的时间,而不是等待一个请求完成到页面,然后抓取它,然后继续下一个。

有没有办法在 heroku/rails 中做到这一点?在哪里可以找到更多信息?

我遇到了 resque-pool,但我不确定它是否能解决这个问题和/或如何实施。我还阅读了有关使用不同类型的服务器运行 rails 以使并发成为可能的信息,但不知道如何修改我目前的情况以利用这一点。

任何帮助将不胜感激。

【问题讨论】:

    标签: ruby-on-rails ruby heroku concurrency resque


    【解决方案1】:

    不要使用Resque。请改用Sidekiq

    Resque在单线程进程中运行,意味着workers同步运行,而Sidekiq在多线程进程中运行,意味着workers在不同线程中异步/同时运行。

    确保为每个工作人员分配一个 URL。如果一名工作人员抓取多个 URL,那是没有用的。

    使用 Sidekiq,您可以将链接传递给工作人员,例如

    LINKS = [...]
    LINKS.each do |link|
      ScrapeWoker.perform_async(link)
    end
    

    perform_async 实际上并没有立即执行作业。相反,链接只是与工作类一起放入redis中的队列中,依此类推,稍后(可能是几毫秒后)工作人员被分配以通过运行perform实例在自己的线程中执行队列中的每个作业ScrapeWorker 中的方法。 Sidekiq 将确保在 worker 执行期间发生异常时重试。

    PS:您没有将链接传递给工作人员。您可以将链接存储到表中,然后将记录的ids 传递给工作人员。

    More info about sidekiq

    【讨论】:

    • 我会看看 Sidekiq。关于每个工作人员一个 URL 的后一部分对我来说很有意义,但我对如何知道所有 URL 何时被抓取的过程有点困惑?想法?
    • 嗨,阿德里安,我仍然很困惑。所以我会调用上面的 Scrapeworker.perform_async(link) ,然后我会调用 Scrapeworker.perform ,然后它会在不同线程中同时从异步执行队列中的所有作业?它会在那里暂停/处理,直到解决了 URL 何时被抓取的问题?
    • 不太对。您不会直接调用 perform 实例方法。 Sidekiq 将读取队列,等待线程池中的线程可用,并要求线程运行队列中指定的工作者的perform 实例方法。您的工作是调用 perform_async 类方法,将作业放入队列。
    • 我明白了 - 但这并不能回答我如何知道作业何时完成,以便我可以返回给用户?
    • 你可以在你的perform方法中做任何事情,比如在你的perform方法结束时在你的表中触发状态、调用其他方法、调用其他worker等(这意味着所有前面的表达式已经通过)。您可以这样做,因为perform 方法的返回值无论如何都没有使用。
    【解决方案2】:

    将这两行添加到您的代码中还可以让您等到最后一个作业完成后再继续:

    • 此行可确保您的程序在检查所有作业是否已完成之前等待至少一个作业入队,以避免将未填充的队列误解为所有作业已完成

    sleep(0.2) until Sidekiq::Queue.new.size > 0 || Sidekiq::Workers.new.size > 0

    • 此行可确保您的程序等待所有作业完成

    sleep(0.5) until Sidekiq::Workers.new.size == 0 && Sidekiq::Queue.new.size == 0

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多