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

php amazon-redshift

36 просмотра

1 ответ

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

  1. CRON запускает скрипт, process.phpкоторый занимает 1000 URL;
  2. process.php работает с этими URL-адресами (до 20 минут);
  3. CRON запускается process.phpснова, и я хочу, чтобы он взял следующие (разные) 1000 URL;

Как я могу предотвратить получение URL, которые уже находятся в процессе?

PS

process.php работает каждые 10 минут

Формат таблицы см. Выше.

+----+------+
| id |  url |
+----+------+
| 1  | url1 |
| 2  | url2 |
| 3  | url3 |
| 4  | url4 |
| 5  | url5 |
+----+------+
Автор: D.Dimitrioglo Источник Размещён: 08.11.2019 11:19

Ответы (1)


1 плюс

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

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

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

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

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

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

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

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

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

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

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

Автор: John Rotenstein Размещён: 20.08.2016 11:39
Вопросы из категории :
32x32