Pular para conteúdo

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

  1. Certifique-se de configurar o tamanho do pool de conexões corretamente. Basicamente, se seu armazenamento (ou seja, memcached) pode lidar com n conexões simultâneas e seu NGINX tem m trabalhadores, então o tamanho do pool de conexões deve ser configurado como n/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ê tiver p instâncias diferentes do NGINX, então o tamanho do pool de conexões deve ser n/m/p.
  2. 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

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.