2

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

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

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

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

所以我的问题:

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

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

4

1 回答 1

3

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

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

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

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

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

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

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

于 2012-06-01T11:43:05.820 回答