如何在Ruby中的多个进程之间分配任务?

时间:2011-04-27 03:26:12

标签: ruby distributed distributed-transactions daemons

我有一个ruby守护程序,可以从数据库中选择100条记录并使用它执行任务。

为了加快速度,我通常会创建同一个守护进程的3个实例。每个人都使用mysql LIMITOFFSET来选择差异数据。

问题在于,有时使用相同的数据记录执行任务2到3次。

所以我认为只信任数据库LIMITOFFSET是不够的......因为有时2个或更多个守护进程实际上可以同时收集相同的数据。

我怎样才能安全地做到?避免2个实例选择相同的数据

  • 守护程序1 =>选择1到100的记录
  • 守护进程2 =>选择101到200的记录
  • 守护程序3 =>选择201到300的记录

1 个答案:

答案 0 :(得分:3)

您可能希望查看用于处理后台作业的现有解决方案,例如Resque(个人喜爱的),而不是滚动您自己的解决方案。使用Resque,您可以使用在您的应用程序中有意义的触发器为每个行排队作业(很难说没有任何上下文),例如您网站上的链接。在任何时候,您都会保持X个工作人员的运行(在您的情况下为三个),Resque将为您执行队列管理工作。 Resque使用Redis作为后端,因此它支持门的原子推/弹出(不再需要双重处理)。

Resque还提供了一个非常直观且易于使用的Web界面,用于监控您的工作和工作人员。