我有一个ruby守护程序,可以从数据库中选择100条记录并使用它执行任务。
为了加快速度,我通常会创建同一个守护进程的3个实例。每个人都使用mysql LIMIT
和OFFSET
来选择差异数据。
问题在于,有时使用相同的数据记录执行任务2到3次。
所以我认为只信任数据库LIMIT
和OFFSET
是不够的......因为有时2个或更多个守护进程实际上可以同时收集相同的数据。
我怎样才能安全地做到?避免2个实例选择相同的数据
答案 0 :(得分:3)
您可能希望查看用于处理后台作业的现有解决方案,例如Resque(个人喜爱的),而不是滚动您自己的解决方案。使用Resque,您可以使用在您的应用程序中有意义的触发器为每个行排队作业(很难说没有任何上下文),例如您网站上的链接。在任何时候,您都会保持X个工作人员的运行(在您的情况下为三个),Resque将为您执行队列管理工作。 Resque使用Redis作为后端,因此它支持门的原子推/弹出(不再需要双重处理)。
Resque还提供了一个非常直观且易于使用的Web界面,用于监控您的工作和工作人员。