Skip to content

Latest commit

 

History

History
63 lines (45 loc) · 4.21 KB

README.md

File metadata and controls

63 lines (45 loc) · 4.21 KB

Site Access Queue

Высокопроизводительная реализация очереди доступа к сайту, с присвоением порядкового номера и отображением заглушки.

Вся логика работы с очередью написана на 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 - название куки

QuickStart

Через docker-compose вы можете запустить демонстрационный пример. Демонстрационная версия построена с использованием lua и openresty с модулем luajit

Требования к Dev окружению:
  • 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 - увеличит число мест на 100
  • localhost:9191/incr-offset?offset=-100 - уменьшит число мест на 100

Получение текущего количеста сессий и доступных слотов

Для мониторинга, реализована страница с статистикой:

http://localhost:9191/stats

Где отдаются данные:

  • available sessions - текущее количество доступных сессий
  • current sessions in queue - количество сессий ожидающих в очереди
  • max active sessions - максимально допустимое количество сессий