Senior
38
10 приложений-обработчиков забирают задачи из БД. Как не допустить, чтобы два экземпляра взяли одну задачу?
Сұралған компаниялар
AI-дан жауап
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 и транзакции для выполнения такого запроса. Это гарантирует, что каждая задача будет обработана ровно одним приложением-обработчиком.