SimpleRateLimiter#

Действие SimpleRateLimiter ограничивает возможное количество запросов согласно установленному лимиту на указанный период времени. Если лимит превышен, то запросы блокируются

Параметры:

Название

Обязательность

Допустимые значения

Описание

rules

+

Последовательность значений вида:
key: ключ (использование переменных не допускается; текстовый тип данных; обязательный параметр);

limit: лимит ограничения (минимальное значение «1»; целочисленный тип данных; обязательный параметр);

period: лимит периода времени (текстовый тип данных с суффиксом: ms - миллисекунды; s - секунды; m - минуты; h - часы; d - дни; w - недели; M - месяцы; y - годы; обязательный параметр);

global: признак доступности счетчика всеми сервисами (логический тип данных; по умолчанию - false);

delta: значение инкремента (минимальное значение «1»; целочисленный тип данных)

Используется в случае:
- отсутствия параметра system.optional.extended_status_zone;

- присутствия параметра system.optional.extended_status_zone и system.optional.extended_status_zone.enabled: on.

В отличие от директивы limit_req, данный счетчик не предполагает функций сглаживаний. Принцип его работы следующий:

  1. Если счетчик, в момент получения запроса, не инициализирован, то он инициализируется начальным значением равным 1.

  2. Каждый следующий запрос увеличивает значение счетчика, ассоциированное со значением ключа на указанный инкремент.

  3. По истечении периода времени с момента отправки первого запроса, указанного в лимите периода времени, счетчик сбрасывается и переходит в неинициализированное значение.

Значение ключа формируется следующим образом:

  1. Если не указан флаг global, то ключ формируется в виде {service_id}_{key}_{limit}, имя зоны счетчика (в модуле статистики) в этом случае будет иметь значение slr_{service_id}_{key}_{limit}.

  2. Иначе, ключ имеет значение profile_{key}_{limit}, а имя зоны slr_profile_{key}_{limit}.

С практической точки зрения, это означает, что в случае установки global в true, если ключ с одним и тем же значением указать в разных сервисах, то он будет общим для этих двух сервисов, т.е. если запросы, приходящие на оба этих сервиса, одновременно будут увеличивать значение счетчика.

Важно учитывать - если используется одна и та же зона с разными значениями лимитов, то в метрике limit для данного ключа будет указываться максимальное значение лимита.

Примеры:

- actions:
  - action: SimpleRateLimiter
    conditions:
    - var: $request_method
      val: POST
      operator: '='
    params:
      rules:
      - key: limit
        limit: 10
        period: 1m

В данном примере для POST-запросов установлен лимит в 10 запросов в минуту.

- actions:
  - action: SimpleRateLimiter
    conditions:
    - var: $request_method
      val: POST
      operator: '='
    params:
      rules:
      - key: limit_post
        limit: 10
        period: 1m
  - action: SimpleRateLimiter
    conditions:
    - var: $request_method
      val: GET
      operator: '='   
    params:
      rules:
      - key: limit_get
        limit: 10
        period: 1m

В данном примере лимиты применяются для запросов в разрезе методов - т.е. 10 запросов в минуту для запросов с методом GET, 10 запросов в минуту для запросов с методом POST.

- actions:
  - action: SimpleRateLimiter
    conditions:
    - var: $request_method
      val: POST
      operator: '='
    params:
      rules:
      - key: limit
        limit: 10
        period: 1m
  - action: SimpleRateLimiter
    conditions:
    - var: $request_method
      val: GET
      operator: '='
    - var: $remote_addr
      val: 192.168.0.1
      operator: '!='      
    params:
      rules:
      - key: limit
        limit: 10
        period: 1s

В этом примере счетчик с ключом limit увеличивается на 1 в том случае, если запрос пришел с методом POST или методом GET и с ip адреса не равным 192.168.0.1, при этом лимит составляет 10 запросов в минуту для POST запросов и 10 запросов в секунду для GET запросов. Важно - так ключ определяется как ключ + период, они не пересекаются.