Перейти к содержанию

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.

Учет в производстве

  1. Убедитесь, что вы правильно настроили размер пула соединений. В основном, если ваше хранилище (т.е. memcached) может обрабатывать n одновременных соединений, а у вашего NGINX m рабочих процессов, то размер пула соединений должен быть настроен как n/m. Это связано с тем, что настроенный размер пула относится к каждому рабочему процессу NGINX. Например, если ваше хранилище обычно обрабатывает 1000 одновременных запросов, а у вас 10 рабочих процессов NGINX, то размер пула соединений должен составлять 100. Аналогично, если у вас p различных экземпляров NGINX, то размер пула соединений должен составлять n/m/p.
  2. Будьте осторожны при кэшировании решений на основе desired_delay, иногда оно слишком мало, и ваш кэш может интерпретировать его как 0 и кэшировать бесконечно. Также кэширование на очень короткое время, вероятно, не добавляет никакой пользы.

Вклад и разработка

Библиотека разработана с учетом возможности расширения. В настоящее время в lib/resty/global_throttle/sliding_window.lua реализован только приближенный алгоритм скользящего окна. Он может использоваться в качестве отправной точки для реализации других алгоритмов.

Провайдеры хранилища реализованы в lib/resty/global_throttle/store/.

Ссылки

GitHub

Вы можете найти дополнительные советы по настройке и документацию для этого модуля в репозитории GitHub для nginx-module-global-throttle.