如何使用Rails和Heroku创建多个并行并发请求
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Rails和Heroku创建多个并行并发请求相关的知识,希望对你有一定的参考价值。
我目前正在开发一个Rails应用程序,它将一长串链接作为输入,使用后台工作程序(Resque)擦除它们,然后将结果提供给用户。但是,在某些情况下,有很多URL,我希望能够并行/并发多个请求,这样可以花费更少的时间,而不是等待一个请求完成一个页面,抓取它,并且继续下一个。
有没有办法在heroku / rails中执行此操作?我在哪里可以找到更多信息?
我遇到了resque-pool,但我不确定它是否会解决这个问题和/或如何实现。我还读过使用不同类型的服务器来运行rails以使并发成为可能,但是不知道如何修改我当前的情况以利用它。
任何帮助将不胜感激。
不要使用Resque
。请改用Sidekiq
。
Resque
在单线程进程中运行,这意味着工作程序同步运行,而Sidekiq
在多线程进程中运行,这意味着工作程序在不同的线程中异步/同步运行。
确保为每个工作人员分配一个URL。如果一个工作人员刮掉多个URL是没用的。
使用Sidekiq,您可以将链接传递给工作人员,例如
LINKS = [...]
LINKS.each do |link|
ScrapeWoker.perform_async(link)
end
perform_async
实际上并没有立即执行这项工作。相反,链接只是与工作类一起放在redis队列中,依此类推,稍后(可能是几毫秒之后)工作者被分配来通过运行perform
实例方法在其自己的线程中执行队列中的每个作业。 ScrapeWorker。如果在执行工作期间发生异常,Sidekiq
将确保再次重试。
PS:你没有传递给工人的链接。您可以将链接存储到表中,然后将记录的id
s传递给工作人员。
将这两行添加到代码中还可以让您等到上一个作业完成后再继续:
- 此行确保您的程序在检查所有作业完成之前等待至少一个作业入队,以避免将未填充的队列误解为所有作业的完成
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
以上是关于如何使用Rails和Heroku创建多个并行并发请求的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Heroku/Rails 4 应用程序设置新的 Redshift 数据库
邮件未在 rails 上使用 devise、heroku 和邮戳发送