Блокировка чтения уровня строки MySQL для замены очереди сообщений - PullRequest
1 голос
/ 19 марта 2012

У меня есть таблица mysql, в которой я храню задания для обработки. в основном это текстовые поля необработанных данных, обработка каждого из которых займет около минуты.

У меня есть 2 сервера, которые извлекают данные из этой таблицы, обрабатывают их, а затем удаляют.

Для управления распределением заданий между двумя серверами я в настоящее время использую amazon SQS. Я храню все идентификаторы строк, которые необходимо обработать, в SQS, рабочие серверы опрашивают SQS, чтобы получить новые строки для работы.

Система в настоящее время работает, но SQS добавляет уровень сложности и затрат, которые, как мне кажется, излишни для достижения того, что я делаю.

Я пытаюсь реализовать то же самое без SQS, и мне было интересно, существует ли какой-либо способ чтения блокировки строки, чтобы, если один работник работал над одной строкой, никакой другой работник не мог выбрать эту строку. Или есть ли лучший способ сделать это.

1 Ответ

1 голос
/ 19 марта 2012

Простой обходной путь: добавьте еще один столбец в таблицу заданий, is_taken_by INT.

Затем на вашем рабочем месте вы сделаете что-то вроде этого:

select job_id from jobs where is_taken_by is null limit 1 for update;
update jobs set is_taken_by = worker_pid where id = job_id;

SELECT ... FOR UPDATE устанавливает эксклюзивные блокировки для строк, которые он читает .Таким образом вы гарантируете, что ни один другой работник не сможет выполнить то же самое задание.

Примечание: эти две строки необходимо выполнить в явной транзакции.

Блокировка строк для обновления с помощью SELECTFOR UPDATE применяется только в том случае, если автоматическая фиксация отключена (либо путем начала транзакции с помощью START TRANSACTION, либо путем установки автоматической фиксации на 0. Если автокоммит включен, строки, соответствующие спецификации, не блокируются.

...