Използвам Laravel 5.1.
Опашките се използват за извличане/синхронизиране на данни между няколко системи.
Използвам драйвера на базата данни, 3 процеса "artisan queue:work --daemon" се изпълняват през цялото време.
Задачите се изпращат както от системните потребители, така и от планировчика (cron). Три опашки се използват за приоритизиране на заданията.
Изглежда, че всичко работи добре - таблицата със задачи се запълва със записи, системата се грижи за тях и премахва тези, които са готови.
След известно време обаче проблемите със заключването започват да пречат:
SQLSTATE[40001]: Грешка при сериализиране: 1213 Намерено блокиране при опит за получаване на заключване; опитайте да рестартирате транзакцията
и
„RuntimeException“ със съобщение „Не може да се размени екземпляр на PDO, докато сте в транзакция.“
и
SQLSTATE[HY000]: Обща грешка: 1205 Времето за изчакване на заключване е превишено; опитайте да рестартирате транзакцията
Все още не съм опитвал да използвам друг драйвер за опашка. Все пак наистина бих искал да остана с база данни. Двигателят е InnoDB, таблицата на заданията има структура и индекси по подразбиране.
Има ли начин да се реши този проблем? Какво мислиш?
Може би си струва да се спомене, че извиквам DB::reconnect()
в моите работни класове, тъй като работниците на опашката работят като демони.
Задачите се изпращат с помощта на DispatchesJobs
характеристика, както може да се очаква. Не се намесвам в алгоритъма на опашките по никакъв друг начин.
COMMIT
транзакции възможно най-скоро. Проверете използването наautocommit
. - person Rick James   schedule 12.09.2015