Задать вопрос
@miki131

Как сделать очередь задача на MySQL?

В базе появляются новые задачи.
Несколько воркеров раз в секунду проверяют наличие новых задач и начинают обрабатывать.
Как сделать чтобы два воркера не взяли одну и ту же задачу?
Точнее, какие блокировки MySQL ставить когда воркер делает селект?

P.S. Про вариант с RabbitMQ знаю, но хотелось бы обойтись без него.
  • Вопрос задан
  • 1059 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
bigton
@bigton
Web-программист
1. Сделайте в таблице поле proccess типа double по умолчанию 0.
2. В PHP скрипте сделайте $process_id = microtime(TRUE) + getmypid(); чтобы получить уникальный для каждого вызова скрипта идентификатор процесса.
3. UPDATE `task` SET `process` = $process_id WHERE `process` = 0 LIMIT 1
4. SELECT * FROM `task` WHERE `process` = $process_id
Таким образом вы добьетесь того, чтобы запускаемые параллельно на обработку скрипты не брали одни данные для обработку.
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Если по одной задаче, то
UPDATE `tasks` 
    SET @id := `id`, `state` = 'in_work', 
        `work_start_time` = NOW(), `worker` = :pid
    WHERE `state` = 'wait'
    ORDER BY `create_time`
    LIMIT 1;
SELECT * FROM `tasks` WHERE `id` = @id;


По окончании обработки
UPDATE `tasks` SET `state` = 'done' WHERE `id` = @id;

Периодически проверять на наличие слишком долго обрабатываемых задач, прибивать процесс по pid и сбрасывать `state` задачи.

P.S. Конечно же, @id := `id`
Ответ написан
Комментировать
@vilgeforce
Раздолбай и программист
LOCK TABLES на момент выбора и назначения воркера - вполне рабочий вариант.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы