Sobes.tech
Назад к вопросам
Senior
6

10 приложений-обработчиков забирают задачи из БД. Как не допустить, чтобы два экземпляра взяли одну задачу?

Компании, где спрашивали
Альфа-БанкАльфа-Банк

Ответ от нейросети

sobes.tech AI

Чтобы избежать ситуации, когда два приложения одновременно забирают одну и ту же задачу из базы данных, нужно обеспечить атомарность операции выбора и блокировки задачи. Один из распространённых подходов — использовать транзакции с блокировкой строк или обновлением статуса задачи.

Например, можно сделать так:

  1. В таблице задач добавить поле status (например, "new", "processing", "done").
  2. При выборе задачи для обработки выполнить запрос, который атомарно обновит статус задачи с "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 и транзакции для выполнения такого запроса. Это гарантирует, что каждая задача будет обработана ровно одним приложением-обработчиком.