global-throttle: Общая система управления потоком с поддержкой общего хранилища
Установка
Если вы еще не подписались на репозиторий RPM, зарегистрируйтесь. После этого вы можете продолжить с следующими шагами.
CentOS/RHEL 7 или Amazon Linux 2
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-global-throttle
CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-global-throttle
Чтобы использовать эту библиотеку Lua с NGINX, убедитесь, что установлен nginx-module-lua.
Этот документ описывает lua-resty-global-throttle v0.2.0, выпущенную 30 декабря 2020 года.
Использование
Общая, распределенная реализация ограничения потока для Openresty. Она может использоваться для ограничения любых действий, будь то запрос или вызов функции. В настоящее время реализовано только приближенное ограничение по скользящему окну.
Сначала подключите модуль:
local global_throttle = require "resty.global_throttle"
После этого вы можете создать экземпляр ограничения следующим образом, где 100 — это лимит, который будет применяться за 2 секунды. Третий параметр указывает ограничителю, какой провайдер хранилища он должен использовать для хранения своей внутренней статистики.
local memc_host = os.getenv("MEMCACHED_HOST")
local memc_port = os.getenv("MEMCACHED_PORT")
...
local my_throttle, err = global_throttle.new(namespace, 10, 2, {
provider = "memcached",
host = memc_host,
port = memc_port,
connect_timeout = 15,
max_idle_timeout = 10000,
pool_size = 100,
})
Наконец, вы вызываете следующее каждый раз перед тем, что бы вы ни ограничивали:
local estimated_final_count, desired_delay, err = my_throttle:process("identifier of whatever it is your are throttling")
Когда desired_delay существует, это означает, что лимит превышен, и клиент должен быть ограничен на desired_delay секунд.
Для более полного понимания того, как использовать эту библиотеку, обратитесь к директории examples.
Учет в производстве
- Убедитесь, что вы правильно настроили размер пула соединений. В основном, если ваше хранилище (т.е. memcached) может обрабатывать
nодновременных соединений, а у вашего NGINXmрабочих процессов, то размер пула соединений должен быть настроен какn/m. Это связано с тем, что настроенный размер пула относится к каждому рабочему процессу NGINX. Например, если ваше хранилище обычно обрабатывает 1000 одновременных запросов, а у вас 10 рабочих процессов NGINX, то размер пула соединений должен составлять 100. Аналогично, если у васpразличных экземпляров NGINX, то размер пула соединений должен составлятьn/m/p. - Будьте осторожны при кэшировании решений на основе
desired_delay, иногда оно слишком мало, и ваш кэш может интерпретировать его как 0 и кэшировать бесконечно. Также кэширование на очень короткое время, вероятно, не добавляет никакой пользы.
Вклад и разработка
Библиотека разработана с учетом возможности расширения. В настоящее время в lib/resty/global_throttle/sliding_window.lua реализован только приближенный алгоритм скользящего окна. Он может использоваться в качестве отправной точки для реализации других алгоритмов.
Провайдеры хранилища реализованы в lib/resty/global_throttle/store/.
Ссылки
- Пост в блоге Cloudflare о приближенном скользящем окне: https://blog.cloudflare.com/counting-things-a-lot-of-different-things/
GitHub
Вы можете найти дополнительные советы по настройке и документацию для этого модуля в репозитории GitHub для nginx-module-global-throttle.