Это третья статья из серии об инфраструктуре 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:
- задания, которые могут выполняться на произвольном узле и могут выполняться одновременно (запуск условий одновременно не является условием )
- задания, которые могут выполняться только один раз в кластере, независимо от того, на каком узле (примечание: мы не учитываем возможность того, что запланированное задание должно выполняться только на определенном узле)
Платформа 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
- есть каталог ошибок, который определяет уникальные коды ошибок с описаниями — это помогает идентифицировать проблемы в исходной системе
- Каталог ошибок представлен в консоли администратора