Używam Laravel 5.1.Jak uniknąć zadań Blokady tabel DB podczas korzystania z kolejek Laravel?
Kolejki służą do pobierania/synchronizowania danych między kilkoma systemami.
Używam sterownika bazy danych, 3 procesy "rzemieślnik kolejki: praca - idemon" działają cały czas.
Zadania są wysyłane zarówno przez użytkowników systemu, jak i program planujący (cron). Trzy kolejki są używane do priorytetyzacji zadań.
Wszystko wydaje się działać dobrze - tabela zadań jest wypełniona rekordami, system zajmuje się nimi i usuwa te, które są wykonywane.
kwestie Jednak po pewnym czasie zaczynają blokujące przeszkadzają:
SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction
i
'RuntimeException' with message 'Can't swap PDO instance while within transaction.'
i
SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction
nie próbowałem jeszcze innego kierowcę za pomocą kolejki. Naprawdę chciałbym zostać w bazie danych. Silnik to InnoDB, tabela zadań ma domyślną strukturę i indeksy.
Czy istnieje sposób rozwiązania tego problemu? Jakie są Twoje myśli?
Warto wspomnieć, że nazywam DB::reconnect()
w moich zajęciach, ponieważ pracownicy kolejkowi działają jako demony.
Zadania są wywoływane z wykorzystaniem cechy DispatchesJobs
, tak jak można się było spodziewać. Nie ingeruję w algorytm kolejek w żaden inny sposób.
Każde rozwiązanie dla tego? –
Nie. Przeniesiono na beanstalkd na teraz. Chociaż podobał mi się sterownik DB lepiej, ponieważ mogłem śledzić zadania i nieudane zadania, po prostu patrząc na tabele DB ... – MaGnetas
Dowiedz się, jak Laravel radzi sobie z "transakcjami" MySQL. Wygląda na to, że rozpocząłeś transakcję, a potem siedziałeś przez długi czas. Transakcje 'COMMIT 'tak szybko, jak to możliwe. Sprawdź użycie 'autocommit'. –