我的 MySQL 数据库中有一个包含 200K 条记录的表。每条记录都包含一个应以某种方式处理的 URL。在我的例子中,URL 处理并不是一项简单的任务,因此我选择使用 Gearman队列以将它们作为后台作业运行。
因此,对于表中的每条记录 (URL),我计划创建单独的任务并将其提供给 Gearman。
此外,我的表中的数据不是静态的,并且经常会在其中添加新的 URL。
根据我的业务逻辑,我需要不断处理这个网址列表。当我完成数据库表中最后一条记录的处理后,我应该移至第一个记录,并对所有记录再次重复该过程。
所以我的问题:
- 这种情况下如何更好的给Gearman提供任务?
- 我应该使用 cron 还是可以组织 Gearman 自动拉取任务的逻辑?
- 一次可以向 Gearman 提交多少个任务?
那么,您能告诉我如何最好地实现这个系统吗?
最佳答案
听起来您需要的是一个队列,其中已处理的项目将被添加回队列的底部。我建议像这样组织工作流程:
系统中出现新 URL 后,将其添加到 Gearman 后台作业队列中。
在 Gearman 工作线程实现中,作业处理完毕后,会再次将其添加到队列中。
这样,您将按照 URL 添加到队列的顺序不断处理 URL,并且整个队列将无限重复。当然,这假设您正在重复执行一项任务。
如果有超过 1 个任务(例如,首先在所有 URL 上执行任务 #1,然后执行任务 #2,等等),您可以遵循类似的模式,只需将作业发送到第二个队列(例如,不同的工作人员)第一个任务之后。然后,根据您想要订购工作的精确程度,您将看到一切自动发生(如果两个工作人员始终可用),或者您将需要监视队列 #1 并仅在其为空时启动工作人员 #2 。有关此类监控的详细信息,请参阅Any way to access Gearman administration?
总的来说,Gearman 可以轻松快速地处理 200,000 个项目。现在,使用持久队列会稍微减慢速度(它本质上是 MySQL/其他数据库连接),但不应该做任何可怕的事情。我自己没有尝试过,但成功的案例通常涉及更多的项目,而且通常还涉及持久的队列。
您需要注意的唯一一件事是 Gearman 不允许批量处理作业(例如同时处理 10 个项目)。当您处理 URL 时,这意味着您需要一次处理 1 个 URL,这是昂贵的,因为您需要等待每个 URL 单独下载。您可以通过使用事件驱动/非阻塞编程语言进行处理来避免它,或者您可以查看 beanstalkd ,它允许这样的批处理。
关于php - 如何用Gearman实现循环任务列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10847288/