У меня есть таблица базы данных с ~ 50K строк в ней, каждая строка представляет работу, которая должна быть выполнена. У меня есть программа, которая извлекает работу из БД, выполняет работу и помещает результат обратно в БД. (эта система работает прямо сейчас)
Теперь я хочу разрешить нескольким задачам обработки выполнять задания, но быть уверенным, что ни одна задача не будет выполнена дважды (из-за проблем с производительностью это не вызовет других проблем). Поскольку доступ осуществляется с помощью хранимой процедуры, мой текущий способ - заменить упомянутую хранимую процедуру чем-то вроде этого
update tbl
set owner = connection_id()
where available and owner is null limit 1;
select stuff
from tbl
where owner = connection_id();
КСТАТИ; рабочие задачи могут разорвать связь между получением работы и отправкой результатов. Кроме того, я не ожидаю, что БД приблизится к тому, чтобы стать узким местом, если я не испорчу эту часть (~ 5 заданий в минуту)
Есть ли проблемы с этим? Есть ли лучший способ сделать это?
Примечание. "База данных как антишаблон IPC" здесь только слегка уместна, потому что
- Я не делаю IPC (нет процесса генерации строк, все они уже существуют) и
- основной недостаток, описанный для этого анти-паттерна, заключается в том, что он приводит к ненужной загрузке БД, поскольку процессы ожидают сообщений (в моем случае, если сообщений нет, все может завершиться, поскольку все сделано)