@dimonchu

Очереди, или достать job и удалить сразу?

Есть например два скрипта, которые работают асинхронно и берут с базы по 50 объектов одновременно.
Вопрос, как сделать так, чтобы скрипты не брали объекты одинаковые и не обрабатывали одно и то же каждый?
скрипт 1 -> БД -> 50 первых объектов
скрипт 2 -> БД -> 50 первых объектов

Я изначально подумал об очередях.

скрипт 1 -> Очередь -> Первый объект
скрипт 2 -> Очередь -> Следующий объект

Но я не понимаю как заставить очередь удалять job с нее, как только скрипт взял этот объект.
Все равно придется: взять объект -> обработать -> удалить. Но в этот момент может взять этот же job другой скрипт, пока первый скрипт будет обрабатывать его.
Хочу по аналогии как с php array_pop функцией: извлечение и возвращение элемента.
Что я делаю не так?)
  • Вопрос задан
  • 40 просмотров
Пригласить эксперта
Ответы на вопрос 1
2ord
@2ord
Один процесс-диспетчер периодически проверяет наличие необработанных записей и кладет в очередь массив первичных ключей размером в 50 записей.
Т.е. процесс делает выборку 50 необработанных записей, кладет в очередь и так до тех пор пока не останется меньше 50. Просыпается через некоторое время и повторяет этот процесс заново.
На обрабатываемые записи нужно ставить метки типа dispatched - это гарантирует что записи не будут выбраны снова.
Воркеры берут каждый свою задачу с массивами pk, обрабатывают их и помечают записи статусом done и так до тех пор пока не закончатся.
А можно и без диспетчера обойтись. Главное, помечать статусом записи.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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