global-throttle: Controle de fluxo de propósito geral com suporte a armazenamento compartilhado
Instalação
Se você ainda não configurou a assinatura do repositório RPM, inscreva-se. Depois, você pode prosseguir com os seguintes passos.
CentOS/RHEL 7 ou 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
Para usar esta biblioteca Lua com NGINX, certifique-se de que o nginx-module-lua está instalado.
Este documento descreve lua-resty-global-throttle v0.2.0 lançado em 30 de dezembro de 2020.
Uso
Uma implementação genérica e distribuída de limitação para OpenResty. Pode ser usada para limitar qualquer ação, seja uma solicitação ou uma chamada de função. Atualmente, apenas a limitação de taxa de janela deslizante aproximada está implementada.
Primeiro, requer o módulo:
local global_throttle = require "resty.global_throttle"
Depois disso, você pode criar uma instância de throttle como a seguinte, onde 100 é o limite que será aplicado a cada janela de 2 segundos. O terceiro parâmetro informa ao limitador qual provedor de armazenamento deve usar para armazenar suas estatísticas internas.
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,
})
Finalmente, você chama o seguinte toda vez antes do que quer limitar:
local estimated_final_count, desired_delay, err = my_throttle:process("identifier of whatever it is your are throttling")
Quando desired_delay existe, isso significa que o limite foi excedido e o cliente deve ser limitado por desired_delay segundos.
Para uma compreensão mais completa de como usar esta biblioteca, consulte o diretório examples.
Considerações de Produção
- Certifique-se de configurar o tamanho do pool de conexões corretamente. Basicamente, se seu armazenamento (ou seja, memcached) pode lidar com
nconexões simultâneas e seu NGINX temmtrabalhadores, então o tamanho do pool de conexões deve ser configurado comon/m. Isso porque o tamanho do pool configurado é por trabalhador do NGINX. Por exemplo, se seu armazenamento geralmente lida com 1000 solicitações simultâneas e você tem 10 trabalhadores do NGINX, então o tamanho do pool de conexões deve ser 100. Da mesma forma, se você tiverpinstâncias diferentes do NGINX, então o tamanho do pool de conexões deve sern/m/p. - Tenha cuidado ao tomar decisões de cache com base em
desired_delay, às vezes é tão pequeno que seu cache pode interpretá-lo como 0 e armazenar indefinidamente. Além disso, armazenar por muito pouco tempo provavelmente não traz nenhum benefício.
Contribuições e Desenvolvimento
A biblioteca foi projetada para ser extensível. Atualmente, apenas o algoritmo de janela deslizante aproximada está implementado em lib/resty/global_throttle/sliding_window.lua. Ele pode ser usado como um ponto de referência para implementar outros algoritmos.
Os provedores de armazenamento estão implementados em lib/resty/global_throttle/store/.
Referências
- Postagem no blog da Cloudflare sobre janela deslizante aproximada: https://blog.cloudflare.com/counting-things-a-lot-of-different-things/
GitHub
Você pode encontrar dicas adicionais de configuração e documentação para este módulo no repositório GitHub do nginx-module-global-throttle.