Enterprise Serial Bus on InterSystems Ensemble

Preview:

Citation preview

Интеграционная шина на базе Ensemble

Дмитрий Засыпкин dmitry.zasypkin@intersystems.com

Приемы реализации

План

• Введение • Общие задачи интеграционной шины. Сервисы ФЭР2.

• Синхронное взаимодействие • Простое приложение Ensemble. Маршрутизация

сообщений на основе бизнес-правил. Трансформация данных.

• Асинхронное взаимодействие • Бизнес-процесс на BPL. Применение WS-Addressing.

Возможности Ensemble: надежная доставка сообщений.

Интеграционная шина

• Задачи шины: • Совместимость • Маршрутизация • Трансформация и

нормализация • Надежная доставка • Безопасность • Протоколирование

Сервисы ФЭР

• ФЭР = Федеральная Электронная Регистратура • Централизованное ведение расписаний приема врачей

• Записаться на прием к врачу можно через gosuslugi.ru • Веб-сервисы ФЭР используют SSL и SOAP 1.2 • Все запросы к сервисам на промышленном сервере

ФЭР должны быть подписаны ЭЦП (УЦ Минздрава)

• Описание сервисов ФЭР – http://egisz.rosminzdrav.ru • Документы > ЭР > Новые документы ФЭР > Описание

интеграционных профилей 2.13.docx

Тестовый сервис ФЭР

• Адрес SOAP-сервиса ФЭР: • http://api-er2.rosminzdrav.ru/mis

• Несколько десятков «методов» • См. раздел 3 документа Описание интеграционных профилей 2.13.docx

• Метод GetMos – поиск медицинских организаций (МО) • Принимает на вход набор критериев поиска МО, а также

«токен авторизации внешней системы» • Выдает список поликлиник/больниц

GetMos: запрос

Вызов сервиса ФЭР из Caché

• В терминале инициируем вызов сервиса ФЭР, используя системный класс %SOAP.WebRequest:

• do ##class(meetup25.test.TestCaller).test()

GetMos: ответ

Ensemble

• Использование инфраструктуры Ensemble для решения интеграционных задач • Бизнес-службы, бизнес-процессы, бизнес-операции • Возможность настроить отдельную очередь сообщений

для каждого бизнес-процесса/операции • Очередь обладает пулом джобов (процессов ОС),

занимающихся обработкой сообщений

Вызов сервиса ФЭР из Ensemble

• Запускаем приложение Ensemble • В классе meetup25.test.TestCaller укажем адрес веб-

сервиса Ensemble • Инициируем вызов веб-сервиса Ensemble в терминале

• do ##class(meetup25.test.TestCaller).test()

Задачи шины

• Задачи шины: • Совместимость • Маршрутизация • Трансформация и

нормализация • Надежная доставка • Безопасность • Протоколирование

Задачи шины

• Задачи шины: • Совместимость • Маршрутизация • Трансформация и

нормализация • Надежная доставка • Безопасность • Протоколирование

Маршрутизация сообщений

• Нацелим бизнес-службу на процесс «Маршрутизатор», который маршрутизирует сообщения согласно бизнес-правилу

• Бизнес-правило анализирует SOAP Action сообщения, поэтому в классе meetup25.test.TestCaller укажем значение SOAP Action равное «GetMos»

• Инициируем вызов веб-сервиса Ensemble в терминале • do ##class(meetup25.test.TestCaller).test()

Задачи шины

• Задачи шины: • Совместимость • Маршрутизация • Трансформация и

нормализация • Надежная доставка • Безопасность • Протоколирование

Трансформация запроса

• Цель: • Использовать в клиентской системе более простой и

понятный формат XML-сообщений, перенеся в Шину специфическую логику оформления запроса для ФЭР

• Этапы трансформации: • 1) Base64-кодирование исходного XML-сообщения • 2) Добавление «оберточных» XML-элементов согласно

спецификации SOAP-сервиса ФЭР

GetMos: запрос

Трансформация запроса

• Этапы трансформации: • Base64-кодирование исходного XML-сообщения • Добавление «оберточных» XML-элементов

• Применяемый шаблон XSLT будем хранить в настройке продукции

• Добавляем трансформацию meetup25.FerRequestDTL в бизнес-правило

• В классе meetup25.test.TestCaller сменим запрос на

Трансформация запроса

• В терминале выполним: do ##class(meetup25.test.TestCaller).test()

Синхронное взаимодействие

• Недостатки синхронного обмена

• В случае сбоя в сети или сбоя ФЭР клиенту потребуется повторно инициировать запрос

• Если ответ от ФЭР не укладывается в тайм-аут клиента, то ошибка

Асинхронное взаимодействие

Асинхронный процесс

Асинхронное взаимодействие

• Изменение правил маршрутизации: • Переключим цель действия send на Асинхронный

процесс • Изменения в классе meetup25.test.TestCaller:

• ONEWAY = 1 (не ожидаем синхронный ответ) • Добавим формирование заголовков WS-Addressing

• В качестве имитации callback-сервиса на стороне системы-клиента используется класс-заглушка

• do ##class(meetup25.test.TestCaller).test()

WS-Addressing

• http://www.w3.org/TR/ws-addr-core/ • WS-Addressing описывает стандартный способ

включения информации о маршрутизации в заголовки SOAP-сообщений <env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'> <env:Header xmlns:wsa='http://www.w3.org/2005/08/addressing'> <wsa:MessageID>urn:uuid:305EE1B2-EEF8-4095…</wsa:MessageID> <wsa:ReplyTo>http://server/callback-service…</wsa:ReplyTo> <wsa:RelatesTo>urn:uuid:7854E197-F7CF-491B…</wsa:RelatesTo> </env:Header> <env:Body> ... </env:Body> </env:Envelope>

Обработка транспортных ошибок

• Настройки бизнес-операции Вызов сервиса ФЭР: • Действия для кода ответа: E=RS • Интервал повторов: 5 (секунд) • Тайм-аут отказа: 15 (секунд) - в реальной системе

может быть несколько суток

• В случае сбоя сети или ошибки сервера ФЭР будут осуществляться повторные попытки вызова сервиса с интервалом 5 секунд в течение 15 секунд. В случае неудачи запрос будет помечен как «отложенный».

• Ensemble >> Просмотр >> Отложенные сообщения

Спасибо за внимание!

Recommended