【问题标题】:How to implement circular task list with Gearman?如何用 Gearman 实现循环任务列表?
【发布时间】:2012-06-01 08:57:37
【问题描述】:

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

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

另外,我的表中的数据不是静态的,而且经常会在那里添加新的 URL。

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

所以我的问题:

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

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

【问题讨论】:

    标签: php mysql gearman circular-list


    【解决方案1】:

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

    1. 一旦新 URL 出现在您的系统中,请将其添加到 Gearman 后台作业队列。

    2. 在 Gearman worker 实现中,一旦作业处理完毕,再次将其添加到队列中。

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

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

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

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

    【讨论】:

    • 非常感谢您的详细解决方案!还有一个问题 - 我应该使用持久的 gearman 队列吗?队列中有 200000 个任务对他来说是个大问题吗?
    • @alexanoid 查看我的答案编辑 - 一般来说,应该没有任何问题。
    • @Aurimas 嗨,但是当我将事务读取到队列时如何保持事务?让我们以发送 job_completed 通知后崩溃的示例流程为例。在这种情况下,该作业将永远无法安排。
    • @VivekGoel 好吧,我想您只需要确保在 job_completed 调用和重新提交到队列之间不会发生崩溃 :) 如果您需要 100% 确定所有时间和边缘情况将是致命的..我想您需要在发送 job_complete 通知之前将其保存在某个地方,并在重新提交后再次删除它。
    猜你喜欢
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 2013-02-04
    • 2011-01-25
    • 1970-01-01
    相关资源
    最近更新 更多