如何用Gearman实现循环任务列表?

时间:2012-06-01 08:57:37

标签: php mysql gearman circular-list

我的MySQL数据库中有一个包含200K记录的表。每条记录都包含一个应以某种方式处理的URL。在我的情况下,URL处理不是一项简单的任务,所以我选择使用Gearman队列来运行这些作为后台作业。

因此,对于我表中的每个记录(URL),我计划创建单独的任务并将其提供给Gearman。

此外,我的表中的数据不是静态的,并且通常会在那里添加新的URL。

根据我的业务逻辑,我需要不断处理这个网址列表。当我完成对数据库表中最后一条记录的处理时,我应该转到第一条记录,并且应该再次对所有记录重复处理。

所以我的问题:

  • 在这种情况下如何更好地为Gearman提供任务?
  • 我应该使用cron还是可以组织Gearman自动提取任务的逻辑?
  • 一次可以向Gearman提交多少个任务?

那么,你能告诉我如何最好地实施这个系统吗?

1 个答案:

答案 0 :(得分:3)

听起来你需要的是一个队列,处理后的项目会被添加回队列的底部。我建议像这样组织工作流程:

  1. 系统中出现新网址后,将其添加到Gearman后台作业队列。

  2. 在Gearman工作器实现中,处理完作业后,再次将其添加到队列中。

  3. 通过这种方式,您将按照添加到队列中的顺序不断处理URL,并且将无限重复整个队列。当然,这假设您重复执行一项任务。

    如果有超过1个任务(例如,首先,在所有URL上执行任务#1,然后执行任务#2等),您可以遵循类似的模式,只需将作业发送到第二个队列(例如,不同的工作人员)在第一个任务之后。然后,根据您想要订购工作的具体程度,您将看到所有事情都自动发生(如果两个工作人员始终都是可用的),或者您将需要监控队列#1并且只有当它为空时才启动工作人员#2 。有关此类监控的详细信息,请参阅Any way to access Gearman administration?

    一般来说,Gearman可以轻松快速地处理20万件物品。现在,使用持久性队列会减慢一些事情(它本质上是一个MySQL /其他数据库连接),但不应该做任何可怕的事情。我自己没有尝试过,但成功案例通常涉及更多的项目,而且往往也是一个持久的队列。

    您唯一需要注意的是Gearman不允许批量处理作业(例如同时处理10个项目)。当您处理URL时,这意味着您需要一次处理1个URL,这是昂贵的,因为您需要等待每个URL单独下载。您可以通过使用事件驱动/非阻塞编程语言进行处理来避免它,或者您可以查看允许此类批处理的beanstalkd