🢂Zarządzanie kolejkami w Laravel przy użyciu Artisan
Poznaj zaawansowane techniki zarządzania kolejkami zadań w Laravel przy użyciu poleceń Artisan i dowiedz się, jak efektywnie wykorzystać asynchroniczne przetwarzanie w swoich aplikacjach.
Laravel oferuje zaawansowany system kolejkowania zadań, który pozwala na asynchroniczne wykonywanie czasochłonnych operacji. Artisan udostępnia szereg poleceń do efektywnego zarządzania kolejkami. W tym artykule przyjrzymy się tym narzędziom i ich praktycznemu zastosowaniu.
Podstawy zarządzania kolejkami
Laravel oferuje zaawansowany system kolejkowania zadań, który pozwala na asynchroniczne wykonywanie czasochłonnych operacji. Artisan udostępnia szereg poleceń do zarządzania kolejkami.
Podstawowym poleceniem do uruchamiania workera kolejki jest php artisan queue:work
, które przetwarza nowe zadania w miarę ich pojawiania się w kolejce. Worker ten będzie kontynuował przetwarzanie zadań, dopóki nie zostanie ręcznie zatrzymany lub dopóki nie zakończy się proces serwera.
Polecenie to oferuje wiele opcji konfiguracyjnych, takich jak:
--queue=[nazwa]
do przetwarzania zadań tylko z określonej kolejki--daemon
do uruchomienia workera w trybie demona (w tle)--sleep=[sekundy]
do określenia czasu uśpienia, gdy nie ma dostępnych zadań--tries=[liczba]
do określenia maksymalnej liczby prób przetworzenia zadania przed uznaniem go za nieudane--timeout=[sekundy]
do ustawienia maksymalnego czasu wykonania zadania
Do monitorowania nieudanych zadań służy polecenie php artisan queue:failed
, które wyświetla listę wszystkich zadań, które nie zostały pomyślnie przetworzone. Polecenie php artisan queue:retry
pozwala na ponowne dodanie nieudanych zadań do kolejki. Można je uruchomić z konkretnym identyfikatorem zadania (np. php artisan queue:retry 5
) lub dla wszystkich nieudanych zadań (php artisan queue:retry all
). Jeśli nieudane zadanie nie może być naprawione i nie powinno być ponownie przetwarzane, można je usunąć za pomocą polecenia php artisan queue:forget [id]
. W przypadku, gdy wszystkie nieudane zadania powinny zostać usunięte, można użyć polecenia php artisan queue:flush
.
Przykłady użycia kolejek
Poniżej znajduje się zestaw praktycznych przykładów zarządzania kolejkami w Laravel:
# Uruchomienie workera kolejki (podstawowe)
php artisan queue:work
# Uruchomienie workera dla konkretnej kolejki
php artisan queue:work --queue=emails
# Uruchomienie workera w trybie demona (w tle)
php artisan queue:work --daemon
# Przetwarzanie tylko jednego zadania, a następnie zakończenie
php artisan queue:work --once
# Ustawienie priorytetu kolejek (high będzie przetwarzana przed default)
php artisan queue:work --queue=high,default
# Określenie maksymalnej liczby prób przed oznaczeniem zadania jako nieudane
php artisan queue:work --tries=3
# Ustawienie limitu czasu wykonania zadania (w sekundach)
php artisan queue:work --timeout=30
# Ustawienie czasu uśpienia workera gdy nie ma zadań (w sekundach)
php artisan queue:work --sleep=3
# Uruchomienie workera dla konkretnego połączenia
php artisan queue:work redis --queue=emails
# Restart wszystkich workerów kolejki (np. po wdrożeniu)
php artisan queue:restart
# Wyświetlenie listy nieudanych zadań
php artisan queue:failed
# Ponowne uruchomienie konkretnego nieudanego zadania
php artisan queue:retry 5
# Ponowne uruchomienie wszystkich nieudanych zadań
php artisan queue:retry all
# Usunięcie nieudanego zadania
php artisan queue:forget 5
# Usunięcie wszystkich nieudanych zadań
php artisan queue:flush
# Wyświetlenie statystyk kolejki (wymaga pakietu horizon)
php artisan horizon:stats
Zaawansowane zarządzanie kolejkami
Przy pracy z większymi aplikacjami często potrzebujemy bardziej zaawansowanych opcji zarządzania kolejkami:
# Uruchomienie workera z obsługą równoczesnego przetwarzania zadań
php artisan queue:work --concurrent=3
# Uruchomienie workera do momentu wyczerpania zadań
php artisan queue:work --stop-when-empty
# Uruchomienie workera z limitem przetworzonych zadań
php artisan queue:work --max-jobs=100
# Uruchomienie workera z limitem pamięci
php artisan queue:work --memory=256
# Utworzenie tabeli dla nieudanych zadań (jeśli używasz bazy danych jako sterownika kolejki)
php artisan queue:failed-table
# Utworzenie migracji tabeli kolejki (dla sterownika bazy danych)
php artisan queue:table
# Uruchomienie workera z pełnym śledzeniem błędów (tryb verbose)
php artisan queue:work --verbose
# Wyczyszczenie konkretnej kolejki (usunięcie wszystkich zadań)
php artisan queue:clear redis --queue=emails
# Monitorowanie wszystkich kolejek w czasie rzeczywistym (wymaga pakietu horizon)
php artisan horizon
# Wstrzymanie przetwarzania wszystkich kolejek (horizon)
php artisan horizon:pause
# Wznowienie przetwarzania wszystkich kolejek (horizon)
php artisan horizon:continue
# Uruchomienie zaplanowanych zadań (scheduler)
php artisan schedule:run
Konfiguracja sterowników kolejki
Laravel obsługuje różne sterowniki kolejek, takie jak baza danych, Redis, Amazon SQS, Beanstalkd i więcej. Artisan oferuje narzędzia do konfiguracji tych sterowników:
# Tworzenie migracji dla tabeli queue (dla sterownika bazy danych)
php artisan queue:table
# Tworzenie migracji dla tabeli failed_jobs (dla wszystkich sterowników)
php artisan queue:failed-table
# Publikowanie konfiguracji sterownika Redis
php artisan vendor:publish --provider="Illuminate\Queue\QueueServiceProvider"
Integracja kolejek z harmonogramem zadań
Laravel pozwala na planowanie zadań za pomocą harmonogramu (scheduler). Można łączyć kolejki z harmonogramem, aby regularnie wysyłać zadania do kolejki:
# Uruchamianie harmonogramu (zwykle konfigurowane w cron)
php artisan schedule:run
# Wyświetlanie listy zaplanowanych zadań
php artisan schedule:list
# Testowanie harmonogramu zadań
php artisan schedule:test
# Uruchomienie pojedynczego zaplanowanego zadania
php artisan schedule:run --name=send-reminders
Rozwiązywanie problemów z kolejkami
W przypadku problemów z kolejkami, pomocne mogą być następujące polecenia:
# Czyszczenie konkretnej kolejki
php artisan queue:clear redis --queue=emails
# Wyczyszczenie wszystkich nieudanych zadań
php artisan queue:flush
# Resetowanie serwera kolejek
php artisan queue:restart
# Sprawdzenie liczby zadań w określonej kolejce (wymaga Redis)
php artisan queue:size --queue=default
# Debugowanie zadań w kolejce
php artisan queue:listen --verbose
# Sprawdzanie statusu workerów
php artisan queue:status
Dobre praktyki korzystania z kolejek
-
Używaj dedykowanych połączeń - Dla krytycznych zadań używaj dedykowanych połączeń i kolejek.
-
Wdrażaj kolejki stopniowo - Rozpocznij od przeniesienia do kolejek zadań, które nie są krytyczne dla głównego przepływu aplikacji.
-
Monitoruj nieudane zadania - Regularnie sprawdzaj nieudane zadania i implementuj procedury obsługi błędów.
-
Ustaw odpowiednie limity czasu - Dostosuj parametry
--timeout
i--tries
do charakterystyki twoich zadań. -
Rozważ użycie supervisor - Dla środowisk produkcyjnych rozważ użycie narzędzia supervisor do zarządzania i monitorowania procesów workera kolejki.
-
Zachowaj idempotentność zadań - Projektuj zadania tak, aby mogły być bezpiecznie uruchamiane wielokrotnie bez niepożądanych skutków ubocznych.
-
Używaj Laravel Horizon dla Redis - Jeśli korzystasz z Redis jako sterownika kolejki, rozważ instalację Laravel Horizon, który oferuje bogaty dashboard do monitorowania i zarządzania kolejkami.
-
Pamiętaj o limitach pamięci - Ustaw odpowiednie limity pamięci, aby zapobiec wyciekowi pamięci w długo działających workerach.