如何锁定红移记录,当他们在工作


How to lock records in Redshift when they are in work

我要做一个循环过程,如:

  1. CRON运行脚本process.php,获取1000个url;
  2. process.php与这些url一起工作(最多20分钟);
  3. CRON再次运行process.php,我希望它采取下一个(不同)1000个url;

如何防止获取正在处理的url ?

公立小学

process.php每10分钟运行一次

表格格式见上文

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

有很多方法可以满足这种"处理一次"的需求。选择通常取决于:

  • 记录被"抓取"的速度
  • 记录是否并行处理
  • 如何处理处理失败

这里有一些想法:

使用队列

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

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

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

标记为已在数据库中处理

添加一个processed_timestamp列到数据库。处理URL时,在数据库上执行UPDATE命令将URL标记为已处理。在检索url时,只处理具有而不是SELECT url。

记住上次处理

检索url时,存储"最后处理"的ID号。这可以存储在另一个数据库表、缓存、磁盘文件、S3文件或通常可访问的任何地方。然后,检索该值以确定接下来需要处理哪些记录,并在开始一批url时更新它。