У меня есть несколько воркеров, распределенных по нескольким узлам, которые очищают HTML. Мне нужно указать ограничение скорости в системе, чтобы ни один домен не получал более 1 запроса каждые 5 секунд.
Каждый рабочий имеет доступ к общей базе данных (PostgreSQL), поэтому я создал таблицу с двумя столбцами:
ключ домена, дата последнего сканирования
В рабочем коде я хочу проверить дату последнего сканирования перед отправкой запроса. Проблема в том, что тысячи рабочих могут получить один и тот же домен почти в один и тот же момент, если задачи распределены циклически, поэтому, если они все читают сразу, они не увидят недавнего сканирования и все запросы будут отправлены. Поэтому мне нужен способ заблокировать поле, чтобы первый проверяемый работник включил блокировку, выполнил сканирование, а затем обновил дату сканирования и снял блокировку. Затем все другие рабочие могут проверить, существует ли блокировка в строке, и отклонить задачу, чтобы она была перенесена в расписание.
Я прочитал страницу руководства по блокировкам и нашел это очень запутанным. В нем говорилось, что все блокировки являются блокировками таблиц, и я не совсем понимал, что это значит о конфликтах. Мне понадобится несколько рабочих, чтобы иметь возможность блокировать / разблокировать разные строки одновременно, а также проверять, существует ли блокировка, прежде чем устанавливать блокировку, чтобы рабочий не зависал в ожидании снятия блокировки и мог перейти к следующей задаче. .
Какой тип замка мне нужен? Есть ли какие-нибудь хорошие примеры, показывающие этот тип блокировки?
Если я просто заключу каждый процесс в транзакцию, это сработает?