ConnectionLimiterPlugin#

Плагин предназначен для ограничения числа подключений клиента к брокеру для определенного пользователя или ip-адреса. Ограничение числа подключений будет осуществляться по последнему адресу граничной системы, т.е. в случае использования proxy необходимо ограничивать число подключений, используя адрес proxy.

Подключение и пример настройки плагина в broker.xml#

  1. В classpath Artemis( e.g.:broker_instance_dir/lib) положить connection-limiter-plugin-*.jar-файл.

  2. В конфигурационном файле broker.xml в части настройки плагинов необходимо добавить следующие настройки:

    <broker-plugins>
    ...
        <broker-plugin class-name="ru.sbt.ss.artemis.connectionLimiter.plugin.ConnectionLimiterPlugin">
           <property key="CONFIG_PATH" value="path_to_config_file" />      <!-- <ОБЯЗАТЕЛЬНЫЙ ПАРАМЕТР: путь до конфигурационного файла -->
           <property key="RELOAD_CHECK_PERIOD_MS" value="period_in_ms" />  <!-- НЕОБЯЗАТЕЛЬНЫЙ ПАРАМЕТР: периодичность проверки планировщиком обнаружения изменений в файле конфигурации в миллисекундах-->
        </broker-plugin>
    ...
    </broker-plugins> 

Настройка

Пример значения

Значение по умолчанию

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

Описание

CONFIG_PATH

etc/connection_limiter_plugin.conf

-

Да

Путь до конфигурационного файла

RELOAD_CHECK_PERIOD_MS

1000

5000

Нет

Периодичность проверки планировщиком обнаружения изменений в файле конфигурации в миллисекундах

  1. Сформировать конфигурационный файл connection_limiter_plugin.conf
    Пример конфигурационного файла:

connectionLimiterPlugin: {
  mode: on
  loginModuleName: "CertLogin"
  userConnectionLimitDefault: 30
  ipAddressConnectionLimitDefault: 10
  noLimitsUsers: ["user54", "user55"]
  noLimitsIpAddresses: ["{ IP_ADDRESS }", "{ IP_ADDRESS }"]
  userLimits: [
    {
      name: "user1"
      connectionLimit: 50
    },
    {
      name: "user2"
      connectionLimit: 30
    }
  ]
  ipAddressLimits: [
    {
      name: "{ IP_ADDRESS }"
      connectionLimit: 5
    },
    {
      name: "{ IP_ADDRESS }"
      connectionLimit: 50
    },
    {
      name: "{ IP_ADDRESS }"
      connectionLimit: 500
    }
  ] 
}

Настройка

Пример значения

Значение по умолчанию

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

Описание

mode

on/off

-

Да

Включение/отключение плагина по ограничению количества коннектов

loginModuleName

"CertLogin"

«CertLogin»

Нет

Наименование модуля, используемого для аутентификации пользователей, подключаемых через ssl-соединение с использованием ssl-сертификатов *

userConnectionLimitDefault

234

-1

Нет

Значение по умолчанию лимита ограничения количества коннектов для пользователей**

ipAddressConnectionLimitDefault

102

-1

Нет

Значение по умолчанию лимита ограничения количества коннектов для ip-адресов***

noLimitsUsers

["user54", "user55"]

[]

Нет

Перечень пользователей, на которых не будут действовать ограничения

noLimitsIpAddresses

["{ IP_ADDRESS }"*]

[]

Нет

Перечень ip-адресов, на которые не будут действовать ограничения

userLimits

[{name: "userName", connectionLimit: 23}, ...]

[]

Нет

Перечень лимитов на подключения для определенных пользователей

ipAddressLimits

[{name: "ipAddressName", connectionLimit: 50}, ...]

[]

Нет

Перечень лимитов на подключения для определенных ip-адресов

* - значение -1 обозначает отсутствие ограничений на количество коннектов для пользователей;
** - значение -1 обозначает отсутствие ограничений на количество коннектов для ip-адресов; *** - значение этой настройки должно совпадать со значением, указанным в etc/bootstrap.xml в настройке jaas-security.certificate-domain.

Примечание: в конфигурационном файле broker.xml может быть задана настройка connectionsAllowed в блоке <acceptor name="***"></acceptor>. Данный параметр определяет общее количество разрешенных коннектов для акцептора. По умолчанию значение connectionsAllowed = -1, т.е. ограничение по количеству коннектов отсутствует. В случае наличия заданного значения для настройки connectionsAllowed отличной от -1 необходимо удостовериться, что задаваемые настройки для ConnectionLimiterPlugin не противоречат данной настройке, т.е. суммарное количество лимитов для всех пользователей/IP-адресов не должно превышать число коннектов, указанных в настройке connectionsAllowed.

Описание работы плагина#

Конфигурация плагина#

Настройки userConnectionLimitDefault/ipAddressConnectionLimitDefault определяют значения по умолчанию лимита коннектов для любого пользователя/ip-адреса, соответственно.

Если для определенного пользователя/ip-адреса необходимо переопределить лимит количества коннектов, то нужно использовать настройки userLimits/ipAddressLimits.

Если для определенного пользователя/ip-адреса необходимо отменить ограничения по количеству коннектов, то в этом случае необходимо использовать настройки noLimitsUsers/noLimitsIpAddresses.

Если в настройке noLimitsUsers/noLimitsIpAddresses присутствует наименование пользователя/ip-адреса и одновременно это же наименование присутствует в настройке userLimits/ipAddressLimits, то приоритет будет иметь настройка noLimitsUsers/noLimitsIpAddresses.

Принцип работы плагина#

После создания соединения (connection) между клиентом и брокером от определенного пользователя (с определенного ip-адреса) происходит сравнение количества существующих соединений для пользователя с установленным в настройках лимитом на соединения от пользователя.

Если число соединений (с учетом текущего) будет превышать заданный лимит, то соединение будет разорвано.

Особенностью работы Artemis-клиента в случае разрыва соединения после его создания является наличие механизма переподключения к брокеру в течение определенного времени, заданного настройкой callTimeout на стороне клиента. По умолчанию, значение этой настройки равно 30 сек.

Если за это время не удалось создать стабильное соединение, то на стороне клиента формруется исключение:

  • org.apache.activemq.artemis.api.core.ActiveMQConnectionTimedOutException — при использовании CORE-API;

  • javax.jms.JMSRuntimeException: Failed to create session factory — при использовании JMS-API, для которого cause=org.apache.activemq.artemis.api.core.ActiveMQConnectionTimedOutException.

При превышении лимита соединений для пользователя/ip-адреса на стороне брокера будет отображаться следующий лог:

WARN  o.a.a.artemis.core.remoting.server.impl.RemotingServiceImpl  - Error executing afterCreateConnection plugin method: CONNECTION_LIMITER_EXCEPTION:The limit on the number of connections set for user=userName exceeded, limit=limitValue 
ru.sbt.ss.artemis.connectionLimiter.plugin.model.error.connectionLimiterException: CONNECTION_LIMITER_EXCEPTION:The limit on the number of connections set for user=userName exceeded, limit=limitValue

Особенности работы плагина#

  1. Использование плагина возможно только для соединений «клиент-брокер» на основе ssl-сертификатов.

  2. При работе плагина сначала происходит проверка превышения лимита для пользователя, ассоциированного с подключением. Если проверка по пользователю пройдена, то происходит проверка превышения лимита по ip-адресу, ассоциированному с подключением. В случае если проверка по пользователю не пройдена, то проверка по ip-адресу не осуществляется.

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

  4. Ограничения, указанные в конфигурационном файле плагина, действуют только на те соединения, которые формируются после загрузки/перезагрузки конфигурации плагина.

Метрики#

Плагин обладает следующим набором метрик:

  1. Счетчик количества превышений лимита числа соединений для определенного пользователя

MBean name метрики для пользователя с именем user_1

org.apache.activemq.artemis:broker="brokerName",component=connection_limiter_metric,user=user_1,name=exceedUserConnectionsLimit
  1. Счетчик количества превышений лимита числа соединений для определенного ip-адреса

MBean name метрики для ip-адреса { IP_ADDRESS }*

org.apache.activemq.artemis:broker="brokerName",component=connection_limiter_metric,ipAddress={ IP_ADDRESS },name=exceedIPConnectionsLimit
  1. Счетчик количества превышений лимита числа соединений для всех пользователей

MBean name метрики

org.apache.activemq.artemis:broker="brokerName",component=connection_limiter_metric,name=exceedUserConnectionsTotal
  1. Счетчик количества превышений лимита числа соединений со всех ip-адресов

MBean name метрики

org.apache.activemq.artemis:broker="brokerName",component=connection_limiter_metric,name=exceedIPConnectionsTotal
  • IP-адреса, приведенные в данном разделе, являются примерами.