Как на уровне NGINX не допустить параллельного обращения к URL?
Всем привет!
Допустим, есть location /cron/, в котором находятся все PHP файлы которые должны исполнятся по расписанию (cron).
Есть ли возможность на уровне NGINX при обращении к location определить "если URL в активных, вернуть код 429"?
Это необходимо для защиты от параллельного запуска скриптов.
Актуально когда один front-сервер, а за ним несколько back-серверов.
Конечно, на уровне PHP я могу использовать Redis для проверки/сохранения состояния занятости скрипта, но Redis-сервер это удалённое хранилище и параллельный запуск скрипта может произойти быстрее проверки/сохранения состояния в Redis.
но Redis-сервер это удалённое хранилище и параллельный запуск скрипта может произойти быстрее проверки/сохранения состояния в Redis
Нет, если это сделано через получение блокировки. Т.е. не запустились и сразу бросились что-то фигачить, а сделали запрос в Redis, получили от него разрешение на запуск (получили блокировку ресурса) и только лишь после этого начали работу. После окончания работы скрипт должен послать запрос на разлочку, причем в идеале стоит это запилить в register_shutdown_function() что бы даже незапланированное завершение скрипта приводило в разлочке ресурса. Эту схему должно быть достаточно просто запилить в проект, кода изменить придеться минимум. В общем нужно заходить от известной схемы с блокировками через семафоры. А Redis рулит блокировками корректно ввиду своей природной однопоточности.
php.net/manual/ru/function.flock.php достаточно простой способ это заблокировать какой-нибудь файл
ну или пересмотреть способ, которым запускаете задачу