如何创建等待作业并执行它们的工作器守护程序?

时间:2014-01-09 17:33:53

标签: ruby-on-rails ruby multithreading ruby-on-rails-4

我是Rails和多线程的新手,我很好奇如何以最优雅的方式实现以下目标。 我找不到任何好的教程,详细解释了以下任务的最佳设计决策:

我有几个HTTP请求将在后台为用户运行,例如,解析几个网站并获取一些信息,如HTTP响应代码,响应时间,然后返回结果。出于性能原因,我决定将要解析的URL总数分成25个批处理,然后在一个线程中执行每个批处理,加入这些并将结果写入数据库。

我决定使用以下gem(http://rubygems.org/gems/thread)来确保同时运行最大线程数。到现在为止还挺好。

问题是,如果两个用户并行开始分析,则最大线程数是我的线程池最大值的两倍。

我的解决方案(imho)是创建一个自己运行的worker守护程序,并等待来自客户端的作业。

我的问题是,在Rails中实现这一目标的最佳方法是什么?

也许创建一个Rake任务,并将其用作守护进程(请参阅:“Daemoninsing a rake task”)和(如何?)向其添加作业?

非常感谢你!

2 个答案:

答案 0 :(得分:0)

我在数据库的表中构建了一个队列,并且cron会定期启动一些代码,它会遍历该表,并将请求传递给Typhoeus and Hydra

以下是作者总结宝石的方法:

  

像具有100个蛇头的神话兽的现代代码版本一样,Typhoeus并行运行HTTP请求,同时干净地封装处理逻辑。

当用户添加请求时,将它们附加到表中。您需要以下字段:

  • “已处理”字段,以便您可以确定在系统出现故障时处理了哪些字段。
  • “成功”字段,以便您可以确定哪些请求已成功处理,因此您可以在失败时重试。
  • “retry_count”字段,因此您可以重试“n”次,然后将该网址标记为无法访问。
  • “next_scan_time”字段,表示何时应再次扫描该网址,以便您不会通过连续点击来管理网站。

Typhoeus和Hydra易于使用,并且可以轻松处理多种请求。

答案 1 :(得分:0)

Rails有很多库可以为您管理长时间运行的后台作业的队列。以下是一些:

  • Sidekiq使用Redis进行作业存储并支持多个工作线程。
  • Resque也使用Redis和单个工作线程。
  • delayed_job通过ActiveRecord(或Mongoid)管理作业队列。

一旦你选择了一个,我建议使用Foreman来简化一次启动多个守护进程。