根据我们所做和所见,一个好的方法是在运行时而不是之前对工作进行分块。换句话说,主/从模式是事件或时间驱动的,当它排队和运行时,主将工作/数据空间分割成细粒度的任务/块。
这样做的原因是,在粗粒度级别上查看计划中的作业要容易得多。在此级别,作业对应于您正在跟踪的单元(例如网页、用户配置文件或来自传感器的流数据)。
我们经常看到细粒度的切片,然后看到每个工人都在处理合理的任务集合。我们发现让每个工作人员处理多个任务(20-1000 个?取决于任务的类型/长度)在以下方面提供了良好的平衡:
- 优化设置(例如建立数据库连接)
- 提供对工作的良好内省
- 使重试和异常处理更易于管理
您希望每个工作人员的处理时间以分钟为单位,而不是长时间运行的任务,这样您就可以更好地了解工作人员的性能,并且重试只会影响有限的工作空间。利用 NoSQL 解决方案(尤其是 MongoHQ 或 MongoLabs 等数据库即服务解决方案)可以让您轻松跟踪和管理分块和正在进行的工作。
另一个建议是创建独立于您的应用程序环境的工作程序。这意味着将每个工作人员编写成合理的自包含以及使用回调、数据库标志和其他异步方法。它可能需要更多的工作,但就像 MVC 应用程序设计一样,它为您提供了更大的敏捷性,并且允许将工作分布在弹性工作系统上。
(全面披露:我在 Iron.io 的团队,IronMQ、IronWorker 和 IronCache 的制造商。)