如何使用Rails和Heroku创建多个并行并发请求

问题描述 投票:0回答:2

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

有没有办法在heroku / rails中执行此操作?我在哪里可以找到更多信息?

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

任何帮助将不胜感激。

ruby-on-rails ruby heroku concurrency resque
2个回答
1
投票

不要使用Resque。请改用Sidekiq

Resque在单线程进程中运行,这意味着工作程序同步运行,而Sidekiq在多线程进程中运行,这意味着工作程序在不同的线程中异步/同步运行。

确保为每个工作人员分配一个URL。如果一个工作人员刮掉多个URL是没用的。

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

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

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

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

More info about sidekiq


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.