Как заблокировать записи в Redshift, когда они в работе

Я собираюсь сделать процесс цикла, как:

  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 |
+----+------+

0

Решение

Существует много подходов к этому требованию «один раз». Выбор часто зависит от:

  • Как быстро «захватываются» записи
  • Обрабатываются ли записи параллельно
  • Как обрабатывать сбои обработки

Вот несколько идей:

Использовать очередь

Вы можете создать очередь, используя Amazon Simple Queuing Service (SQS). Сначала запустите задание, которое извлекает URL-адреса из базы данных и помещает их в сообщение очереди. Затем, process.php можете прочитать подробности из очереди вместо базы данных.

Во время работы скрипта сообщение SQS невидимый поэтому другие процессы не могут его получить. Когда процесс завершится, он должен удалить сообщение из очереди. Если в середине процесса происходит сбой, невидимое сообщение появляется снова через заданный интервал для повторной обработки.

Очереди являются стандартным способом обработки многих записей. Это позволяет распределять обработку по нескольким приложениям / серверам. Вы даже можете вставлять отдельные URL-адреса в очередь, а не группировать.

Отметить их как обработанные в базе данных

Добавить processed_timestamp столбец в базу данных. Когда URL обработан, сделайте UPDATE команда в базе данных, чтобы пометить URL как обработанный. Только при поиске URL SELECT те, которые имеют не были обработаны.

Запомнить последний обработанный

При получении URL-адресов сохраняйте идентификационный номер «последнего обработанного». Это может быть сохранено в другой таблице базы данных, в кэше, на диске, в файле S3 или в любом другом месте, которое обычно доступно. Затем извлеките это значение, чтобы определить, какие записи необходимо обработать, и обновите его при запуске пакета URL-адресов.

1

Другие решения

Других решений пока нет …