Высокопроизводительная реализация очереди доступа к сайту, с присвоением порядкового номера и отображением заглушки.
Вся логика работы с очередью написана на openresty/libs/queue.lua
- Openresty или nginx с luajit
- Redis
$queue_session_lifetime
- время жизни сессии в сек$queue_max_sessions
- количество максимальных сессий$queue_redis_timeout
- timeout к redis$queue_redis_host
- hostname или ip к redis$queue_redis_port
- port у redis$queue_cookie_name
- название куки
Через docker-compose вы можете запустить демонстрационный пример. Демонстрационная версия построена с использованием lua и openresty с модулем luajit
- docker
- docker-compose
docker-compose up
Открываем localhost:9191.
Первые 5 сессий (клиенты из разных браузеров - зависит от куки) попадут сразу на целевой сайт.
Как только слоты забьются, дальше начнет отображаться заглушка со счетчиком.
Время жизни сессии по-умолчанию - 20 секунд. Все конфиги настраиваются в nginx.conf и описаны выше в разделе Доступные конфиги
.
На старте из конфига берется значение $queue_max_sessions
и создается global_offset
в redis.
Каждая новая сессия получает новую позицию из очереди, инкрементируя global_counter
в redis, и сохраняет свою позицию с ключом, равным своей уникальной куке.
В дальнейшем для каждой сессии на nginx получаем его position
и текущий global_offset
.
Отнимаем global_offset
от position
и принимаем решение:
- Если значение меньше или равно 0, то у нас есть свободные слоты на сессии, пользователя можно пропустить на сайт
- Если больше 0 - то это число является позицией пользователя в очереди, и его нужно отобразить на странице-заглушке.
При каждом запросе обновляется время жизни сессии в redis. Если сессия истекает, то global_offset
инкрементируеся (это реализовано на go в app/main.go
).
Если ресурсы проекта изменились - например, появилась возможность обслуживать больше клиентов - то количество свободных мест можно изменить динамически без остановки сервиса:
localhost:9191/incr-offset?offset=100
- увеличит число мест на 100localhost:9191/incr-offset?offset=-100
- уменьшит число мест на 100
Для мониторинга, реализована страница с статистикой:
http://localhost:9191/stats
Где отдаются данные:
available sessions
- текущее количество доступных сессийcurrent sessions in queue
- количество сессий ожидающих в очередиmax active sessions
- максимально допустимое количество сессий