2016-08-20 37 views
0

我会像做一个循环的过程:如何锁定在红移记录,当他们在工作

  1. 科雷运行脚本process.php这需要1000个网址;
  2. process.php作品与这些网址(最多20分钟);
  3. 科雷再次运行process.php,我希望它采取下一个(不同的)1000个网址;

我怎样才能防止获取网址指向已在处理中?

P.S.

process.php运行每隔10分钟

表格式见上文。

+----+------+ 
| id | url | 
+----+------+ 
| 1 | url1 | 
| 2 | url2 | 
| 3 | url3 | 
| 4 | url4 | 
| 5 | url5 | 
+----+------+ 
+0

你的Id列是一个单调递增的数字吗?你的PHP程序可以保存它检索到的最大ID吗?您可以使用指示它已被处理的列来更新表格。或者你甚至可以拥有一个工作状态表,用已经检索到的ID进行更新。 – BigDataKid

+0

是的,我的ID列正在增加。 Redshift的更新速度非常缓慢,这就是为什么我们不能用“进行中”标志标记网址。最后一个选项稍微微不足道,我想稍后再离开它。谢谢。 –

回答

1

这种“过程一次”要求有许多方法。选择通常取决于:

  • 如何快速记录“抓住”
  • 无论记录并行
  • 如何处理加工不良

这里处理的一些想法:

使用队列

您可以使用Amazon Simple Queuing Service(SQS)创建队列。首先,运行一个从数据库中提取URL并将它们放入队列消息的作业。然后,process.php可以从队列中读取详细信息而不是数据库。

脚本运行时,SQS消息是隐藏所以其他进程无法获取它。当进程完成时,它应该从队列中删除消息。如果进程在中途失败,那么在预定义的时间间隔之后,不可见的消息会重新出现以进行重新处理。

队列是处理多条记录的标准方法。它允许处理分布在多个应用程序/服务器上。您甚至可以将单个URL插入队列中,而不是批量处理。

将其标记为处理数据库

一个processed_timestamp列添加到数据库中。处理URL时,请在数据库上执行UPDATE命令以将URL标记为已处理。当检索的网址,只SELECT那些有被处理。

记住上次处理

当检索的URL,存储 '上次处理' 的ID号。这可以存储在另一个数据库表,缓存,磁盘文件,S3文件或通常可访问的任何地方。然后,检索此值以确定下一个需要处理的记录,并在启动一批URL时对其进行更新。

+0

谢谢约翰!好的方法。我已经在使用Redis存储最后一个ID的方式执行第3个。 –