2011-06-05 125 views
1

我正在构建一个将从远程网站获取并重新验证信息的工作。我实际上已经实现了一个队列,它的工作原理是这样的: 读取文本文件,然后切片成5k的增量并交给线程处理器,然后退出并生成新的工作器。Rails队列管理

我正在研究resque,但有一个类似这样的问题的一般设计问题。因此,如果我有一份可能需要5-20M单位工作的工作,那么存储队列的最佳做法是什么?例如,我理论上可以将工作分解并存储起来,然后为该大块创建工作,或者我可以在队列中拥有5-20M个别订单项。看起来好像在获取/重新生成的工作中有很多开销。但是,也有体面的开销和更多的编码,试图分块工作。

+0

请问这个远程网站对你的感觉让20M的要求? – 2011-06-05 21:30:35

+0

它在技术上是一个API,所以有坚持的限制。 – 2011-06-05 21:46:11

回答

1

根据我们所做的和看到的,一个好方法是在运行时分块工作,而不是之前。换句话说,主/从模式是事件或时间驱动的,主模块在队列和运行时将工作/数据空间分割成细粒度的任务/块。

这样做的原因是,在粗粮级别完成时,查看计划中的作业要容易得多。在此级别,作业对应于您正在跟踪的单元(例如网页,用户配置文件或来自传感器的流式传输数据)。

我们经常看到在精细粒度级别切片,但接着看到每个工作人员都在合理收集任务。我们发现,有每个工作进程多个任务(20-1000取决于任务的类型/长度?)提供之间的良好平衡:

  • 优化设置(建立例如数据库连接)
  • 提供了良好的自省到工作
  • 使重试和异常处理更易于管理

你会想为每个工人的处理时间在几分钟而不是长时间运行的任务,只是让你有更多的可视性工人表现等等重试只影响有限的工作空间。使用NoSQL解决方案(尤其是像MongoHQ或MongoLabs这样的数据库即服务的解决方案)可以让您轻松跟踪和管理分块和正在进行的工作。

另一个建议是创建独立于您的应用程序环境的工作人员。这意味着要将每个工作人员编写为合理自包含的,以及使用回调函数,数据库标志和其他异步方法。它可能稍微有点多,但就像MVC应用程序设计一样,它可以提供更大的灵活性,并允许将工作分布在弹性工作系统上。

(全面披露:我对球队在Iron.io,IronMQ,联合冲剪机,并IronCache的制造商)