Как запретить системе очередей обрабатывать более одного задания из очереди одновременно? - PullRequest
0 голосов
/ 03 февраля 2020

У меня много заданий, которые нужно обрабатывать в правильном порядке. Я хотел бы разделить их по «типу» на разные очереди. Очереди должны создаваться динамически. Затем я хотел бы запустить X работников, которые будут обрабатывать задачи из очередей. Но есть одно важное правило - из каждой очереди только одна задача должна обрабатываться одновременно. Причина в том, что каждая задача указанного типа может изменить состояние приложения, поэтому я не могу начать обработку новой задачи того же типа, если последняя еще не завершена.

Я бы хотел использовать Laravel систему очередей с драйвером Redis, но я не уверен, что он сможет это сделать. Как запретить системе очередей принимать более одной работы из каждой очереди одновременно? Есть идеи?

Заранее благодарю за помощь.

Ответы [ 2 ]

0 голосов
/ 03 февраля 2020

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

Если вы хотите указать соединение и очередь по умолчанию, которые должны использоваться для цепочечных заданий, вы можете используйте методы allOnConnection и allOnQueue.

ProcessPodcast::withChain([
    new OptimizePodcast,
    new ReleasePodcast
])->dispatch()->allOnConnection('redis')->allOnQueue('podcasts');

См. Laravel документы для получения дополнительной информации.

0 голосов
/ 03 февраля 2020

Если вы используете supervisor, то это то, что вы можете сделать в вашем файле .conf. Директива

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/html/****/artisan queue:work
autostart=true
autorestart=true
user=root
numprocs=1  <----- this is what you are looking for
redirect_stderr=true
stdout_logfile=/var/www/html/****/storage/logs/supervisord.log

numprocs даст команду Supervisor запустить 1 очередь: работа обрабатывает и контролирует его, автоматически перезапуская в случае сбоя. (Laravel Диспетчер очереди Do c)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...