ConnectionLimiterPlugin#
Плагин предназначен для ограничения числа подключений клиента к брокеру для определенного пользователя или ip-адреса. Ограничение числа подключений будет осуществляться по последнему адресу граничной системы, т.е. в случае использования proxy необходимо ограничивать число подключений, используя адрес proxy.
Подключение и пример настройки плагина в broker.xml#
В classpath Artemis( e.g.:
broker_instance_dir/lib) положить connection-limiter-plugin-*.jar-файл.В конфигурационном файле 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 |
|
- |
Да |
Путь до конфигурационного файла |
RELOAD_CHECK_PERIOD_MS |
1000 |
5000 |
Нет |
Периодичность проверки планировщиком обнаружения изменений в файле конфигурации в миллисекундах |
Сформировать конфигурационный файл
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 |
|
- |
Да |
Включение/отключение плагина по ограничению количества коннектов |
loginModuleName |
|
«CertLogin» |
Нет |
Наименование модуля, используемого для аутентификации пользователей, подключаемых через ssl-соединение с использованием ssl-сертификатов * |
userConnectionLimitDefault |
|
|
Нет |
Значение по умолчанию лимита ограничения количества коннектов для пользователей** |
ipAddressConnectionLimitDefault |
|
|
Нет |
Значение по умолчанию лимита ограничения количества коннектов для ip-адресов*** |
noLimitsUsers |
|
[] |
Нет |
Перечень пользователей, на которых не будут действовать ограничения |
noLimitsIpAddresses |
|
[] |
Нет |
Перечень ip-адресов, на которые не будут действовать ограничения |
userLimits |
|
[] |
Нет |
Перечень лимитов на подключения для определенных пользователей |
ipAddressLimits |
|
[] |
Нет |
Перечень лимитов на подключения для определенных 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
Особенности работы плагина#
Использование плагина возможно только для соединений «клиент-брокер» на основе ssl-сертификатов.
При работе плагина сначала происходит проверка превышения лимита для пользователя, ассоциированного с подключением. Если проверка по пользователю пройдена, то происходит проверка превышения лимита по ip-адресу, ассоциированному с подключением. В случае если проверка по пользователю не пройдена, то проверка по ip-адресу не осуществляется.
Плагин поддерживает перезагрузку конфигурации без необходимости перезапуска брокера. Для того, чтобы новая конфигурация была применена, необходимо обязательно провести сохранение конфигурационного файла.
Ограничения, указанные в конфигурационном файле плагина, действуют только на те соединения, которые формируются после загрузки/перезагрузки конфигурации плагина.
Метрики#
Плагин обладает следующим набором метрик:
Счетчик количества превышений лимита числа соединений для определенного пользователя
MBean name метрики для пользователя с именем user_1
org.apache.activemq.artemis:broker="brokerName",component=connection_limiter_metric,user=user_1,name=exceedUserConnectionsLimit
Счетчик количества превышений лимита числа соединений для определенного ip-адреса
MBean name метрики для ip-адреса { IP_ADDRESS }*
org.apache.activemq.artemis:broker="brokerName",component=connection_limiter_metric,ipAddress={ IP_ADDRESS },name=exceedIPConnectionsLimit
Счетчик количества превышений лимита числа соединений для всех пользователей
MBean name метрики
org.apache.activemq.artemis:broker="brokerName",component=connection_limiter_metric,name=exceedUserConnectionsTotal
Счетчик количества превышений лимита числа соединений со всех ip-адресов
MBean name метрики
org.apache.activemq.artemis:broker="brokerName",component=connection_limiter_metric,name=exceedIPConnectionsTotal
IP-адреса, приведенные в данном разделе, являются примерами.