Статьи

OpenHub Framework — следующие интересные функции

Это третья статья из серии об инфраструктуре OpenHub — первая представленная платформа OpenHub, а вторая представленная модель асинхронного обмена сообщениями .

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

Дроссельный

Регулирование — это функциональность, которая проверяет количество входных запросов к платформе интеграции, и если это число превышает установленный предел, новые запросы ограничиваются.

Основная цель регулирования состоит в том, чтобы ограничить непропорциональную (и часто преднамеренную) перегрузку интеграционной платформы огромным количеством входных запросов для обработки. Это плохо повлияет на производительность приложения и даже может остановить обработку текущих сообщений.

Компонент регулирования учитывает входные запросы от указанной исходной (внешней) системы и для конкретной операции. Если это число превысит установленный лимит за определенный промежуток времени, тогда OpenHub начнет отклонять новые входные запросы (только запросы от указанной исходной системы и для указанной операции) — выдается исключение. Компонент регулирования поддерживает кластер.

Функциональность регулирования может быть настроена следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
###############################################################################
#  Throttling configuration
#
#   There the following property names:
#   - throttling.defaultInterval: default time interval (in seconds) if not defined by system/operation
#   - throttling.defaultLimit: default limit if not defined by system/operation
#   - throttling.sourceSystem.operationName, where
#       - sourceSystem is specific source system or '*' if any system
#            (source system is case-insensitive value from trace header (ExternalSystemExtEnum))
#       - operationName is specific operation name or '*' if any operation
#
#   Property values (except for default values) have the following format:
#       limit [/interval]
#
#   Examples:
#       throttling.crm.op1=10
#       throttling.crm.*=10/40
#       throttling.*.sendSms=60/30
###############################################################################
   
throttling.defaultInterval=60
throttling.defaultLimit=60
throttling.sourceSystem.*=300/60
throttling.*.syncHello=15/60
throttling.*.asyncHello=50/60

Например:

throttling.crm.op1 = 10 (ограничение вызовов операции op1 из системы CRM до 10 запросов в течение 60 секунд)
throttling.crm. * = 10/40 (ограничение вызовов любой операции из системы CRM до 10 запросов в течение 40 секунд)
throttling. *. sendSms = 60/30 (ограничение на вызовы операции sendSms из любой системы до 60 запросов на 30 секунд)

Оповещения

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

Метрики настраиваются — запрос SQL для получения количества элементов и ограничения для проверки.

Примеры оповещений (также с последующими операциями):

  • если количество ошибочных сообщений за последние 10 минут превышает 5, то отправляет письмо администраторам
  • когда количество сообщений, ожидающих ответа от внешней системы более 5 минут, превышает 10, то отправляет электронное письмо администраторам

Пример конфигурации по умолчанию:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
###############################################################################
#  Alerts configuration
#
#   There the following property names:
#   - alerts.N.id: unique alert identification (if not defined then order number (=N) is used instead)
#   - alerts.N.limit: limit that must be exceeded to activate alert
#   - alerts.N.sql: SQL query that returns count of items for comparison with limit value
#   - [alerts.N.enabled]: if specified alert is enabled or disabled; enabled is by default
#   - [alerts.N.mail.subject]: notification (email, sms) subject; can be used Java Formatter placeholders (%s = alert ID)
#   - [alerts.N.mail.body]: notification (email, sms) body; can be used Java Formatter placeholders (%d = actual count, %d = limit)
#
###############################################################################
   
# checks if there is any waiting message that exceeds time limit for timeout
alerts.900.id=WAITING_MSG_ALERT
alerts.900.limit=0
alerts.900.sql=SELECT COUNT(*) FROM message WHERE state = 'WAITING_FOR_RES' AND last_update_timestamp < (current_timestamp - interval '3600 seconds')

Примечание. Каждую конфигурацию можно настроить через JMX на лету.

Запланированные работы

Существует два типа запланированных заданий, которые поддерживает OpenHub:

  1. задания, которые могут выполняться на произвольном узле и могут выполняться одновременно (запуск условий одновременно не является условием )
  2. задания, которые могут выполняться только один раз в кластере, независимо от того, на каком узле (примечание: мы не учитываем возможность того, что запланированное задание должно выполняться только на определенном узле)

Платформа OpenHub предлагает собственный API для определения рабочих мест.

Примеры конфигурации:

1
2
3
@OpenHubQuartzJob(name = "AsyncPostponedJob", executeTypeInCluster = JobExecuteTypeInCluster.NOT_CONCURRENT,
        simpleTriggers = @QuartzSimpleTrigger(repeatIntervalMillis = 30000))
public void invokePostponedJob() {}
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
@OpenHubQuartzJob(name = "MoreTriggerJob", executeTypeInCluster = JobExecuteTypeInCluster.CONCURRENT,
        cronTriggers = {
                @QuartzCronTrigger(cronExpression = "0 00 23 ? * *",
                        name = "FirstTriggerForJob",
                        group = "MoreTriggerGroup"),
                @QuartzCronTrigger(cronExpression = "0 00 10 ? * *",
                        misfireInstruction = CronTriggerMisfireInstruction.FIRE_ONCE_NOW,
                        name = "SecondTriggerForJob",
                        group = "MoreTriggerGroup")},
        simpleTriggers = {
                @QuartzSimpleTrigger(repeatIntervalMillis = 10000,
                        repeatCount = 20,
                        name = "ThirdTriggerForJob",
                        group = "MoreTriggerGroup"),
                @QuartzSimpleTrigger(repeatIntervalProperty = ASYNCH_PARTLY_FAILED_REPEAT_TIME_SEC,
                        intervalPropertyUnit = SimpleTriggerPropertyUnit.SECONDS,
                        misfireInstruction = SimpleTriggerMisfireInstruction.FIRE_NOW,
                        name = "FourthTriggerForJob",
                        group = "MoreTriggerGroup")
        })
public void invokeJob() {}

Отслеживание запросов / ответов

Функция отслеживания запросов / ответов позволяет сохранить внутреннюю связь между маршрутами или связь с внешними системами в базе данных. После этого вы можете перейти непосредственно в базу данных и просмотреть таблицы запросов и ответов или просмотреть консоль администратора.

Детализация сообщения - отслеживание запроса / ответа

Детализация сообщения — отслеживание запроса / ответа

Обработка ошибок

В Apache Camel есть базовая обработка ошибок, но у платформы OpenHub есть своя концепция, как обрабатывать ошибки:

  • есть собственная иерархия исключений с базовым IntegrationException
  • есть каталог ошибок, который определяет уникальные коды ошибок с описаниями — это помогает идентифицировать проблемы в исходной системе
  • Каталог ошибок представлен в консоли администратора
Каталог ошибок

Каталог ошибок