2011-04-27 64 views
0

我有一个ruby守护进程,它从数据库中选择100条记录并使用它执行任务。如何在Ruby中的多个进程之间分配任务?

为了使速度更快,我通常创建3个相同守护进程的实例。每个人使用mysql LIMITOFFSET来选择不同的数据。

问题是有时一个任务在相同的数据记录中执行2或3次。

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

我该如何安全地做到这一点?避免2个实例选择相同的数据

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

回答

3

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

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

+0

目前我正在使用ruby的守护进程gem(github.com/mikehale/daemons)。我所做的是检查有多少实例正在运行,并将带有LIMIT和OFFSET的PARAMS传递给每个守护进程实例。所以......如果我发送1000封电子邮件,每个守护进程实例将选择diferents 100数据库的行。但有时候我会收到一行或两封或三封电子邮件。这意味着2守护进程的实例正在选择相同的数据库行。 – newx 2011-04-27 13:00:46

+0

我明白你的问题是什么。我想说的是,你不应该浪费你的时间来处理这个逻辑。人们已经投入了数百小时的时间来创建适合处理后台工作的图书馆。你应该专注于自己的工作。这就是说,我相信你刚刚在你的SQL中遇到了一个错误。 – bloudermilk 2011-04-27 18:35:03

+0

感谢您的回答......我正在审阅Resque以了解如何改进我的应用程序......非常感谢 – newx 2011-05-05 19:46:07

相关问题