Мое приложение 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