Ich habe eine einfache Webanwendung, die mit dem Laravel 4.2-Framework geschrieben wurde. Ich habe die Laravel Queue-Komponente konfiguriert, um neue Queue-Elemente zu einem lokal laufenden beastalkd Server hinzuzufügen.
Im Wesentlichen gibt es eine POST-Route, die der Bohnenrohrröhre ein Element hinzufügt.
Ich habe dann Supervisord eingerichtet, um artisan queue:listen
als drei separate Prozesse laufen zu lassen. Das Problem, das ich sehe, ist, dass die verschiedenen queue:listen
-Prozesse irgendwo zwischen ein bis drei queue:worker
-Prozessen für nur einen eingefügten Job erzeugen.
Das Endergebnis ist, dass ein Job, der in die Warteschlange eingefügt wird, manchmal von mehreren Arbeitern gleichzeitig verarbeitet wird, was ich offensichtlich zu vermeiden versuche.
Der Jobcode ist relativ einfach:
%Vor%Der spaßige Teil ist, dass die meisten der (doppelten) Warteschlangen-Workers beim Löschen des Jobs mit dieser Fehlermeldung im Fehlerprotokoll fehlschlagen:
%Vor%Der Wert für ttr (Time to Run) ist auf 172.800 Sekunden (oder 48 Stunden) festgelegt. Dies ist viel länger als die Zeit, die für den Abschluss des Jobs benötigt wird.
Was ist der Job, den time_to_run in der Warteschlange hat? Wenn der Job länger als time_to_run Sekunden dauert, wird der Job automatisch erneut in die Warteschlange eingereiht und kann vom nächsten Mitarbeiter ausgeführt werden.
Ein reservierter Job hat time_to_run Sekunden, um gelöscht, freigegeben oder berührt zu werden. Durch den Aufruf von touch()
wird der Zeitüberschreitungstimer neu gestartet, sodass die Worker ihn verwenden können, um mehr Zeit für den Abschluss zu haben. Oder verwenden Sie einen ausreichend großen Wert beim Einreihen in die Warteschlange.
Ich habe das beanstalkd-Protokolldokument als hilfreich empfunden Ссылка
Da Sie mit Laravel arbeiten, überprüfen Sie Ihre queue.php
Konfigurationsdatei.
Ändern Sie den Wert ttr von 60 (Standard) auf etwas anderes, das besser für Sie ist.
%Vor%Tags und Links php laravel beanstalkd