如何在Redshift工作时锁定记录

时间:2016-08-20 12:36:22

标签: php amazon-redshift

我打算做一个循环过程,如:

  1. CRON运行脚本process.php,需要1000个网址;
  2. process.php适用于这些网址(最多20分钟);
  3. CRON再次运行process.php,我想让它接下来(不同的)1000个网址;
  4. 如何防止获取已在进行中的网址?

    P.S。

    process.php每10分钟运行一次

    表格格式见上文。

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

1 个答案:

答案 0 :(得分:1)

这种“一次性处理”要求有很多种方法。选择通常取决于:

  • “抓住”记录的速度有多快
  • 是否并行处理记录
  • 如何处理处理失败

以下是一些想法:

使用队列

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

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

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

将其标记为已在数据库中处理

向数据库添加processed_timestamp列。处理URL时,在数据库上执行UPDATE命令以将URL标记为已处理。检索网址时,只处理SELECT个网址。

请记住上次处理

检索网址时,请存储“上次处理的”ID号。这可以存储在另一个数据库表,缓存,磁盘文件,S3文件或通常可访问的任何位置。然后,检索此值以确定下一个需要处理的记录,并在启动一批URL时更新它。