Мое приложение Laravel работает за балансировщиком нагрузки, и одновременно работают 2 экземпляра EC2. Раньше я управлял cronjob только на одном сервере, но это не идеальный способ, потому что, если нагрузка увеличится или произойдет какая-то необычная ошибка, и если инициализируется третий экземпляр EC2, cronjob запустится и на этом сервере, и мой cronjob выполняет критическую задачу, такую как зарядка полосы или срок ее действия. подписки, и если оба сервера выполняют задачу cronjob, пользователь будет взимать плату за полосу несколько раз.
Поэтому, чтобы справиться с этой ситуацией, я реализовал распределенную блокировку с помощью Redis. Я изменил драйвер кэша по умолчанию с файла на redis в файле .env. CACHE_DRIVER=redis и в Console/Kernel.php добавлен такой метод onOneServer.
Код: Выделить всё
$schedule->command('subscription:autorenew')->everyMinute()->withoutOverlapping()->onOneServer();
теперь даже на обоих серверах включен crontab, он выполняет задачу только на одном сервере, но в моем конвейере развертывания есть команда php artisancache:clear из-за этой блокировки снимается даже задача выполняется, и второй сервер также начинает выполнять ту же задачу в то же время.
Есть ли какой-либо встроенный способ laravel, где я могу установить свой CACHE_DRIVER=file по умолчанию и все равно используйте Redis для распределенной блокировки, чтобы php artisancache:clear не влияет на блокировку кэша Redis?
Подробнее здесь:
https://stackoverflow.com/questions/791 ... -cacheclea