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

标签 php mysql gearman circular-list

我的 MySQL 数据库中有一个包含 200K 条记录的表。每条记录都包含一个应以某种方式处理的 URL。在我的例子中,URL 处理并不是一项简单的任务,因此我选择使用 Gearman队列以将它们作为后台作业运行。

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

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

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

所以我的问题:

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

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

最佳答案

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

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

  2. 在 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/

相关文章:

php - Gearman - 客户

php - 自动 API 数据库插入?

MySQL SQL 查询分析和查询成本工具和技术

mysql - 有什么不同?

php - 在特定日期和时间在 Gearman 中安排工作

mysql - 如何在MySQL触发器实现中使用gearman客户端

php - 表 [tablename] 未锁定

php - 变量在 IF 语句中失去范围/值?

PHP输入mysql数据库

php - 在连接查询中根据表名区分记录