Назад к вопросам
Альфа-Банк
Senior
6
10 приложений-обработчиков забирают задачи из БД. Как не допустить, чтобы два экземпляра взяли одну задачу?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
Чтобы избежать ситуации, когда два приложения одновременно забирают одну и ту же задачу из базы данных, нужно обеспечить атомарность операции выбора и блокировки задачи. Один из распространённых подходов — использовать транзакции с блокировкой строк или обновлением статуса задачи.
Например, можно сделать так:
- В таблице задач добавить поле
status(например, "new", "processing", "done"). - При выборе задачи для обработки выполнить запрос, который атомарно обновит статус задачи с "new" на "processing" и вернёт обновлённую строку.
Пример на SQL (PostgreSQL):
UPDATE tasks
SET status = 'processing'
WHERE id = (
SELECT id FROM tasks WHERE status = 'new' LIMIT 1 FOR UPDATE SKIP LOCKED
)
RETURNING *;
Здесь FOR UPDATE SKIP LOCKED позволяет другим транзакциям пропускать уже заблокированные строки, что предотвращает двойное взятие одной задачи.
В Java можно использовать JDBC и транзакции для выполнения такого запроса. Это гарантирует, что каждая задача будет обработана ровно одним приложением-обработчиком.