SharedMapSetter#

Помещает сообщение в разделяемый кэш. Работа с хранилищем shared map, построенном на базе Shared Memory в Nginx.

Параметры:

Название

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

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

Описание

operation

+

ADD/REPLACE/INCREMENT

Тип операции: ADD — добавление; REPLACE — замена; INCREMENT — увеличение существующего значения на заданную дельту (только для числовых значений)

shared_store_key

+

Строка, содержащая выражение из переменных и/или констант

Обязательный параметр, задающий ключ, с которым сообщение будет помещено в кэш

shared_store_name

+

Строка, содержащая имя разделяемого хранилища

Должно указываться имя ранее объявленного хранилища

lifetime

-

Текстовое значение с суффиксом: ms — миллисекунды; s — секунды; m — минуты; h — часы; d — дни; w — недели; M — месяцы, 30 дней; y — годы, 365 дней. Может также содержать переменную

Время жизни помещаемого в кэш значения, по истечении которого оно будет удалено

initvalue

-

Используется в случае operation = INCREMENT, как начальное значение счетчика, должно быть задано либо число, либо переменная (в этом случае строка должна начинаться со знака $ и результат выполнения переменной должен содержать целое число).

ignore_already_exists

-

Игнорировать ошибку вставки с существующим ключом. Применимо для операции PUT - по умолчанию, попытка поместить запись с ключом уже существуюшим в кэше приводит к ошибке ALREADY_EXISTS. Если установить ignore_already_exists в true, то в этом случае действие не завершится с ошибкой, однако значение в кэше не будет обновлено. В случае если необходимо обновление значений, испольуйте операцию REPLACE.

Заполняемые переменные:

Название

Диапазон значений

Описание

clj_shared_map_error

MESSAGE_UNKNOWN/DEFAULT_ERROR/ALREADY_EXISTS

MESSAGE_UNKNOWN — попытка получить сообщение по ключу, который отсутствует в кэше; DEFAULT_ERROR — внутренняя ошибка; ALREADY_EXISTS — сообщение с таким ключом уже есть в кэше.

Переменная заполняется только в случае ошибки.

Замечание 1: Данное действие всегда ожидает входящего сообщения. Если сообщение отсутствует или не инициализировано, то в результате выполнения действие завершится с ошибкой.

Замечание 2: Входное сообщение трактуется по-разному в зависимости от значения OPERATION. Для значений ADD и REPLACE - это значение, помещаемое в разделяемый кэш, для INCREMENT - величина инкремента (целое число).

Пример:

system:
  storages:
    - name: storage_1
services:
 service_http_proxy:
  - id: 1
    chains:
      - action: SharedMapSetter
        conditions:
         - {var: request_method, value: PUT, operator: "="}
        params:
          operation: ADD
          shared_store_key:  $arg_ID
          shared_store_name: storage_1
          lifetime: 1h
        message: $clj_request_body
      - action: SharedMapSetter
        conditions:
         - {var: request_method, value: POST, operator: "="}
        params:
          operation: REPLACE
          shared_store_key:  $arg_ID
          shared_store_name: storage_1
          lifetime: 1h
        message: $clj_request_body

В примере, в зависимости от метода запроса, тело запроса помещается в кэш на 1 час, или заменяется, если оно ранее там существовало (по ключу из параметра запроса ID).

    chains:
      request_chains:
      - message: '1'
        actions:
        - action: SharedMapSetter
          params:
            operation: INCREMENT
            initValue: '0'
            lifetime: 1s
            shared_store_key: $request_method
            shared_store_name: counter
        - action: SharedMapToVars
          params:
            shared_store_name: counter
            rules:
            - operation: GET
              key: $request_method
              var: $clj_current_count
              setWhenEmpty: true
              default_empty_value: '0'
        - action: ConditionChecker
          conditions:
          - var: $request_method
            val: POST
            operator: '='
          params:
            rules:
            - var: $clj_current_count
              val: '500'
              operator: <   

Значение счетчика инкрементируется в разрезе метода запроса, время жизни значения 1 секунда. По достижению 500 запросов в течение 1с, запросы с методом POST начинают блокироваться.