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