Я использую Laravel 5.1.
Очереди используются для сбора/синхронизации данных между несколькими системами.
Я использую драйвер базы данных, все три процесса "workisan queue: work --daemon" работают постоянно.
Работы отправляются как пользователями системы, так и планировщиком (cron). Для приоритизации заданий используются три очереди.
Кажется, что все работает нормально - таблица заданий заполняется записями, система заботится о них и удаляет те, которые были сделаны.
Однако через некоторое время проблемы блокировки начинают мешать:
SQLSTATE [40001]: сбой последовательной обработки: 1213. пытаясь получить блокировку; попробуйте перезапустить транзакцию
и
"RuntimeException" с сообщением "Невозможно заменить PDO-экземпляр в то время как внутри сделка.
и
SQLSTATE [HY000]: общая ошибка: 1205 превышено время ожидания блокировки; пытаться перезагрузка транзакции
Я еще не пробовал использовать еще один драйвер очереди. Я действительно хотел бы остаться с базой данных. Двигатель InnoDB, таблица заданий имеет структуру и индексы по умолчанию.
Есть ли способ решить эту проблему? Каковы ваши мысли?
Возможно, стоит упомянуть, что я вызываю DB::reconnect()
внутри моих классов заданий, так как рабочие очереди работают как демоны.
Задачи отправляются с использованием признака DispatchesJobs
, как и следовало ожидать. Я не мешаю алгоритму очередей любым другим способом.