bigton
@bigton
Web-программист

Как на уровне NGINX не допустить параллельного обращения к URL?

Всем привет!

Допустим, есть location /cron/, в котором находятся все PHP файлы которые должны исполнятся по расписанию (cron).
Есть ли возможность на уровне NGINX при обращении к location определить "если URL в активных, вернуть код 429"?

Это необходимо для защиты от параллельного запуска скриптов.

Актуально когда один front-сервер, а за ним несколько back-серверов.

Конечно, на уровне PHP я могу использовать Redis для проверки/сохранения состояния занятости скрипта, но Redis-сервер это удалённое хранилище и параллельный запуск скрипта может произойти быстрее проверки/сохранения состояния в Redis.

Спасибо!
  • Вопрос задан
  • 205 просмотров
Решения вопроса 1
alekciy
@alekciy
Вёбных дел мастер
но Redis-сервер это удалённое хранилище и параллельный запуск скрипта может произойти быстрее проверки/сохранения состояния в Redis

Нет, если это сделано через получение блокировки. Т.е. не запустились и сразу бросились что-то фигачить, а сделали запрос в Redis, получили от него разрешение на запуск (получили блокировку ресурса) и только лишь после этого начали работу. После окончания работы скрипт должен послать запрос на разлочку, причем в идеале стоит это запилить в register_shutdown_function() что бы даже незапланированное завершение скрипта приводило в разлочке ресурса. Эту схему должно быть достаточно просто запилить в проект, кода изменить придеться минимум. В общем нужно заходить от известной схемы с блокировками через семафоры. А Redis рулит блокировками корректно ввиду своей природной однопоточности.

Так же по теме: Distributed locks with Redis
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
evnuh
@evnuh
Поиск Гугл помог мне, впусти и ты его в свой дом
HTTP - stateless протокол, без внешнего хранилища - никак. Это могут быть файл на диске, редис, что угодно.
Ответ написан
Комментировать
daager
@daager
php.net/manual/ru/function.flock.php достаточно простой способ это заблокировать какой-нибудь файл
ну или пересмотреть способ, которым запускаете задачу
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы