Meine Laravel-Anwendung befindet sich hinter dem Load Balancer und 2 EC2-Instanzen laufen gleichzeitig. Vorher habe ich Cronjob nur auf einem Server verwaltet, aber das ist keine ideale Methode, denn wenn die Last zunimmt oder ein ungewöhnlicher Fehler auftritt und die dritte EC2-Instanz initialisiert wird, wird Cronjob auch auf diesem Server gestartet und mein Cronjob führt wichtige Aufgaben wie Stripe-Aufladung oder Ablauf von Abonnements aus, und wenn beide Server Cronjob-Tasks ausführen, berechnet der Benutzer Stripe mehrmals.
Um diese Situation zu bewältigen, habe ich verteiltes Sperren mit Redis implementiert. Ich habe meinen Standard-Cache-Treiber von Datei auf Redis in der .env-Datei geändert. CACHE_DRIVER=redis und in Console/Kernel.php eine onOneServer-Methode wie diese hinzugefügt.
Code: Select all
$schedule->command('subscription:autorenew')->everyMinute()->withoutOverlapping()->onOneServer();
Jetzt, obwohl auf beiden Servern Crontab aktiviert ist, führt es die Aufgabe nur auf einem Server aus, aber meine Bereitstellungspipeline hat den Befehl php artisan cache:clear, da die Sperre aufgehoben wird, obwohl die Aufgabe in Bearbeitung ist und der zweite Server gleichzeitig mit der Ausführung derselben Aufgabe beginnt.
Gibt es eine eingebaute Laravel-Methode, mit der ich meine Standard-CACHE_DRIVER=Datei festlegen kann und trotzdem Redis für die verteilte Sperre verwenden kann, damit PHP artisan Cache:clear hat keinen Einfluss auf die Redis-Cache-Sperre?