Сервер очередей#

Отправка событий в сервер очередей#

В сервер очередей могут быть отправлены следующие события:

  • регистрация пользователя (USER_REGISTERED);

  • смена пароля (USER_PASSWORD_SET);

  • смена признака аннулирования сессий (USER_CRID_CHANGED);

  • изменения атрибутов пользователя (USER_ATTRIBUTE_CHANGED);

  • очистка атрибутов пользователя (USER_ATTRIBUTE_REMOVED);

  • удаление пользователя (USER_REMOVED);

  • привязка внешней учетной записи (FEDERATION_POINT_BOUND);

  • отвязка внешней учетной записи (FEDERATION_POINT_UNBOUND);

  • отзыв выданного приложению разрешения (scopes) (SCOPES_REVOKED);

  • создание группы (GROUP_CREATED);

  • изменение атрибутов группы (GROUP_UPDATED);

  • удаление группы (GROUP_REMOVED);

  • включение пользователя в группу (GROUP_MEMBER_ADDED);

  • исключение пользователя из группы (GROUP_MEMBER_REMOVED).

Для отправки событий в очередь следует создать блок blitz.prod.local.idp.events следующего содержания (на примере регистрации пользователя и смены пароля):

"events" : {
    "drivers" : {
        "rabbit_driver" : {
            "properties" : {},
            "server" : {
                "host" : "<RMQ_HOST>",
                "port" : 5672
            },
            "type" : "RMQ",
            "user" : {
                "password" : "<RMQ_PASS>",
                "username" : "<RMQ_USERNAME>"
            }
        }
    },
    "routes" : {
        "USER_PASSWORD_SET" : [
            "password_sync"
        ],
        "USER_REGISTERED" : [
            "registration"
        ]
    },
    "targets" : [
        {
            "discardList" : "PSWD_SYNC_DISCARD",
            "driver" : {
                "ext" : {
                    "exchange_name" : "users",
                    "routing_key" : "pwd_sync"
                },
                "id" : "rabbit_driver"
            },
            "encCertificate" : "rmqkey",
            "name" : "password_sync",
            "redelivery" : 3
        },
        {
            "discardList" : "REG_DISCARD",
            "driver" : {
                "ext" : {
                    "exchange_name" : "users",
                    "routing_key" : "registration"
                },
                "id" : "rabbit_driver"
            },
            "encCertificate" : "rmqkey",
            "name" : "registration",
            "redelivery" : 3
        }
    ]
}

В данных настройках следует задать:

  • RMQ_HOST – домен сервера очередей RabbitMQ;

  • RMQ_USERNAME – имя пользователя для работы с сервером очередей;

  • RMQ_PASS – пароль для работы с сервером очередей.

Кроме того, для шифрования паролей, отправляемых в очередь (только для сообщений USER_REGISTERED и USER_PASSWORD_SET), в параметре encCertificate следует указать псевдоним ключа электронной подписи (в стандартном хранилище ключей BlitzIdPKeystore.jks), которым следует шифровать пароли в сообщениях.

Сервер очередей как брокер сообщений#

В Blitz Identity Provider для обработки асинхронных задач применяется встроенный брокер сообщений, использующий для отслеживания задач базу данных.

При большой интенсивности запросов к Blitz Identity Provider может быть целесообразным использование сервера очередей RabbitMQ в качестве брокера сообщений. Для этого нужно в консоли RabbitMQ (обычно, http://hostname:15672/) выполнить следующие настройки:

  • создать queue с именем blitz-tasks (в меню «Queues» консоли);

  • создать exchange с именем blitz-tasks-exh (в меню «Exchanges» консоли) и настроить binding на очередь blitz-tasks с routing_key с именем blitz-tasks;

  • создать пользователя blitz (в меню «Admin» консоли) и назначить ему права на созданную очередь.

После настройки RabbitMQ необходимо скорректировать настройки в blitz.conf – в блоке blitz.prod.local.idp.tasks установить broker-type в значение rmq и задать настройки подключения к RabbitMQ в блоке broker-rmq:

  • в параметре exchange задать имя blitz-tasks-exh;

  • в параметре queue в блоке executionRules и в параметре name в блоке queues задать имя blitz-tasks;

  • в параметре username в блоке user задать имя пользователя (blitz);

  • в параметре password в блоке user задать пароль пользователя в открытом виде – после запуска Blitz Identity Provider пароль будет зашифрован;

  • в параметрах host и port блока server указать адрес и порт подключения к RabbitMQ;

  • при необходимости скорректировать остальные параметры, определяющие размер пула соединений (poolSize), количества каналов (channelSize), время ожидания отклика от сервера очередей (ackTimeout);

  • при необходимости скорректировать настройки брокера обработки задачи, определяющие количество попыток (maxAttempts) повторной обработки задач в случае ошибки, время между попытками (redeliveryDelayInSec), размер обрабатываемой пачки сообщений (dequeueBatchSize), период проверки очереди (dequeuePeriodInSec), количество обработчиков (executorPoolSize):

Пример конфига приведен ниже:

"tasks" : {
    "broker-type" : "rmq",
    "broker-rmq" : {
        "consumer" : {
            "poolSize" : 2
         },
         "exchange" : "blitz-task-exh",
         "publisher" : {
             "ackTimeout" : 15,
              "channelsSize" : 8,
              "poolSize" : 2
         },
         "server" : {
             "host" : "RMQ_HOST",
             "port" : 5672
         },
         "user" : {
             "password" : "CHANGE_ME",
             "username" : "blitz"
         }
    },
    "executionRules" : [
        {
            "maxAttempts" : 2,
            "queue" : "blitz-tasks",
            "redeliveryDelayInSec" : 60
        }
    ],
    "queues" : [
        {
            "dequeueBatchSize" : 10,
            "dequeuePeriodInSec" : 30,
            "executorPoolSize" : 5,
            "name" : "blitz-tasks"
        }
    ]
}