1

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

我正在研究 resque,但有一个关于此类问题的通用设计问题。因此,如果我的工作可能包含 5-20M 个工作单元,那么存储队列的最佳实践是什么?例如,理论上我可以将工作分块并存储,然后为该块创建一个作业,或者我可以在队列中有 5-20M 个单独的行项目。在获取/重新生成的工作中似乎有很多开销。但是也有相当大的开销和更多的编码来尝试分块工作。

4

1 回答 1

1

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

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

我们经常看到细粒度的切片,然后看到每个工人都在处理合理的任务集合。我们发现让每个工作人员处理多个任务(20-1000 个?取决于任务的类型/长度)在以下方面提供了良好的平衡:

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

您希望每个工作人员的处理时间以分钟为单位,而不是长时间运行的任务,这样您就可以更好地了解工作人员的性能,并且重试只会影响有限的工作空间。利用 NoSQL 解决方案(尤其是 MongoHQ 或 MongoLabs 等数据库即服务解决方案)可以让您轻松跟踪和管理分块和正在进行的工作。

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

(全面披露:我在 Iron.io 的团队,IronMQ、IronWorker 和 IronCache 的制造商。)

于 2011-06-07T16:19:37.223 回答