2015-05-05 10 views
11

Um eine große Anzahl von Jobs zu verarbeiten, führe ich eine variable Anzahl von Warteschlangen Worker abhängig davon, wie viel Arbeit zu vervollständigen ist. Ich möchte nicht mehr Arbeitskräfte anstellen, als notwendig sind, um die Arbeit zu erledigen, die in einem von uns für angemessen gehaltenen Zeitraum erledigt werden muss.Laravel Artisan CLI sicher stoppen Daemon Queue Worker

Im Moment starte ich 5 Daemon Queue Worker zu Testzwecken, aber in der Produktion könnte diese Zahl zwischen 25 & 100 Arbeiter, möglicherweise mehr. Ich verstehe, dass ich bei der Bereitstellung die Warteschlangenarbeiter stoppen muss, indem ich zuerst das Framework in den Wartungsmodus versetzt, indem ich php artisan down verwende, da das Flag --daemon das Framework nur lädt, wenn der Worker gestartet wird Bereitstellen, bis der Worker neu gestartet wird.

Wenn ich die Arbeiter aus irgendeinem Grund stoppen musste, konnte ich die Anwendung in den Wartungsmodus setzen mit php artisan down, was dazu führen würde, dass die Arbeiter sterben, sobald sie ihren aktuellen Job bearbeitet haben (wenn sie einen arbeiten). Es kann jedoch vorkommen, dass ich die Mitarbeiter töten möchte, ohne die gesamte Anwendung in den Wartungsmodus zu versetzen.

Gibt es eine sichere Möglichkeit, die Arbeiter so zu stoppen, dass sie ihren aktuellen Job weiter bearbeiten und dann sterben, ohne die gesamte Anwendung in den Wartungsmodus zu versetzen?

Wesentlichen, was ich brauche, ist ein php artisan queue:stop, die wie php artisan queue:restart verhält, aber nicht die Arbeiter neu starten, wenn die Arbeit erledigt ist.

Ich war zu erwarten, dass ein wie php artisan queue:stop Befehl, der dies tun würde, aber das scheint nicht der Fall zu sein.

Mit ps aux | grep php Ich bin in der Lage, die Prozess-IDs für die Arbeiter zu bekommen, und ich könnte die Prozesse auf diese Weise töten, aber ich möchte nicht den Prozess mitten in der Arbeit an einem Job zu töten.

Danke.

+2

Für jeden, der diese Frage findet. http://stackoverflow.com/questions/30060526/laravel-artisan-cli-safely-stop-daemon-queue-workers#comment48332831_30087630 hat die Antwort. php artisan queue: Neustart stoppt die Worker. Der Name "Neustart" ist irreführend. Die Arbeiter werden nicht neu gestartet, nachdem sie gestoppt wurden. – Vigs

+0

ist korrekt.Der "Neustart" findet nur statt, wenn Sie etwas wie Supervisor-Setup zur Überwachung haben und diese nach dem Beenden automatisch neu starten. (Welches ist die typische Konfiguration.) –

Antwort

2

Wir haben so etwas in unserer Anwendung implementiert - aber es war nicht etwas, das in Laravel selbst eingebaut wurde. Sie müssten this file bearbeiten, indem Sie dem if-Block eine weitere Bedingung hinzufügen, so dass er die stop-Funktion aufrufen würde. Sie können dies tun, indem Sie entweder eine statische Variable in der Klasse Worker setzen, die geändert wird, wenn Sie einen benutzerdefinierten Befehl ausführen (z. B. php artisan queue:pause) oder indem Sie irgendwo einen atomaren Wert überprüfen (dh in einem Cache wie redis setzen) , memcached, APC oder sogar MySQL, obwohl dies bedeuten würde, dass Sie für jeden Zyklus dieser while-Schleife eine MySQL-Abfrage haben, die Sie mit demselben benutzerdefinierten Befehl einstellen.

+0

Yah ich hatte Angst, ich müsste so etwas tun. Muss redis oder memcache-Setup bekommen, das Überprüfen der Flagge ist eine Art Verschwendung einer Frage, besonders wenn es für jede Wiederholung in einer Schleife mit 25 - 100 Arbeitern geschieht. Beste Antwort ich habe sofar, also +. Hoffentlich fügen sie so etwas in späteren Versionen hinzu. – Vigs

+0

Ja, APC/redis/memcached wäre der Weg zu gehen, mit APC ist der beste in dieser Situation. – Nikko

2

Wenn die --daemon Flag verwendet wird, sollten Arbeiter nicht beendet werden, wenn die Warteschlange leer ist.

Ich denke, was Sie suchen ist in the documentation for queues.

Der php artisan queue:restart Befehl, um die Arbeiter aufgefordert wird neu starten, nachdem sie ihren aktuellen Job zu erledigen sind.

+1

Richtig, ich möchte nicht, dass die Worker anhalten, wenn die Warteschlange leer ist. Ich möchte die Warteschlangenarbeiter auf Befehl stoppen, aber "sicher", damit sie nicht mitten in der Verarbeitung eines Jobs stehenbleiben. 'php artisan queue: restart', tut leider nicht, was ich tun muss. Ich möchte die Arbeiter nicht neu starten, ich möchte sie "sicher" aufhalten. Die Dokumentation enthält keine Informationen zum Stoppen eines Warteschlangenmitarbeiters, es wird lediglich erwähnt, dass Sie dies möglicherweise manuell tun müssen. – Vigs

+0

Im Wesentlichen brauche ich eine 'php artisan queue: stop', die sich wie' php artisan queue: restart' verhält, aber den Worker nicht neu startet, sobald der Job erledigt ist. – Vigs

+7

Öffnen Sie ein Terminal mit 'php artisan queue: work --daemon' und führen Sie' php artisan queue: restart' in einem anderen Terminal aus. Das erste Terminal wird nach einiger Zeit tatsächlich heruntergefahren. Es startet es eigentlich nicht neu, das ist bis zu einem separaten Prozess wie http://supervisord.org/ zu handhaben. – Deinumite