Zum Inhalt

global-throttle: Allgemeine Flusskontrolle mit Unterstützung für gemeinsamen Speicher

Installation

Wenn Sie das RPM-Repository-Abonnement noch nicht eingerichtet haben, melden Sie sich an. Danach können Sie mit den folgenden Schritten fortfahren.

CentOS/RHEL 7 oder 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

Um diese Lua-Bibliothek mit NGINX zu verwenden, stellen Sie sicher, dass nginx-module-lua installiert ist.

Dieses Dokument beschreibt lua-resty-global-throttle v0.2.0, das am 30. Dezember 2020 veröffentlicht wurde.


Verwendung

Eine generische, verteilte Drosselungsimplementierung für OpenResty. Sie kann verwendet werden, um jede Aktion zu drosseln, sei es eine Anfrage oder ein Funktionsaufruf. Derzeit ist nur eine ungefähre Drosselung mit gleitendem Fenster implementiert.

Zuerst fordern Sie das Modul an:

local global_throttle = require "resty.global_throttle"

Danach können Sie eine Instanz der Drosselung wie folgt erstellen, wobei 100 das Limit ist, das pro 2-Sekunden-Fenster durchgesetzt wird. Der dritte Parameter sagt dem Drosselungsmechanismus, welchen Speicheranbieter er verwenden soll, um seine internen Statistiken zu speichern.

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,
})

Schließlich rufen Sie jedes Mal Folgendes auf, bevor Sie das, was auch immer Sie drosseln, aufrufen:

local estimated_final_count, desired_delay, err = my_throttle:process("identifier of whatever it is your are throttling")

Wenn desired_delay vorhanden ist, bedeutet dies, dass das Limit überschritten wird und der Client für desired_delay Sekunden gedrosselt werden sollte.

Für ein vollständigeres Verständnis, wie Sie diese Bibliothek verwenden, verweisen Sie auf das Verzeichnis examples.

Produktionsüberlegungen

  1. Stellen Sie sicher, dass Sie die Größe des Verbindungs-Pools richtig konfigurieren. Grundsätzlich, wenn Ihr Speicher (d.h. memcached) n gleichzeitige Verbindungen verarbeiten kann und Ihr NGINX m Worker hat, sollte die Größe des Verbindungs-Pools als n/m konfiguriert werden. Das liegt daran, dass die konfigurierte Poolgröße pro NGINX-Worker gilt. Wenn Ihr Speicher beispielsweise normalerweise 1000 gleichzeitige Anfragen verarbeitet und Sie 10 NGINX-Worker haben, sollte die Größe des Verbindungs-Pools 100 betragen. Ähnlich, wenn Sie p verschiedene NGINX-Instanzen haben, sollte die Größe des Verbindungs-Pools n/m/p betragen.
  2. Seien Sie vorsichtig, wenn Sie Entscheidungen basierend auf desired_delay cachen. Manchmal ist es so klein, dass Ihr Cache es als 0 interpretieren und unendlich cachen kann. Auch das Caching für sehr kurze Zeit bringt wahrscheinlich keinen Nutzen.

Beiträge und Entwicklung

Die Bibliothek ist so konzipiert, dass sie erweiterbar ist. Derzeit ist nur der ungefähre Algorithmus für gleitende Fenster in lib/resty/global_throttle/sliding_window.lua implementiert. Er kann als Referenzpunkt verwendet werden, um andere Algorithmen zu implementieren.

Speicheranbieter sind in lib/resty/global_throttle/store/ implementiert.

Referenzen

GitHub

Zusätzliche Konfigurationstipps und Dokumentationen für dieses Modul finden Sie im GitHub-Repository für nginx-module-global-throttle.