Маршрутизация сообщений
Узел вида МаршрутизаторПоСодержимому предназначен для того, чтобы определять, в какие узлы из тех, что идут непосредственно за этим узлом, должны попасть сообщения. Для этого у узла есть событие ОбработчикОпределенияПолучателей, в котором вы на встроенном языке можете сформировать набор таких узлов. Если этот обработчик отсутствует, то сообщение будет отправлено во все узлы, которые идут сразу после этого узла.
У обработчика есть два параметра. Первый — это Контекст, он описывает, в каком узле происходит вызов. Второй — это Сообщение, которое нужно маршрутизировать. Его нельзя изменить, также как нельзя модифицировать параметры его заголовка.
Если этот обработчик вернет пустую коллекцию узлов, то сообщение никуда не будет доставлено.
Если в возвращаемом массиве будет хотя бы один неправильный получатель, сообщение продублируется в канал недоставленных сообщений, но будет отправлено всем правильным получателям.
Если при выполнении обработчика возникает неперехваченная ошибка, сообщение отправляется в канал недоставленных сообщений.
Отправка всем
Есть следующий процесс интеграции: сообщение генерируется таймером и попадает в узел ОтправкаВсем. Это маршрутизатор по содержимому, из которого сообщение попадает в узлы HTTP и RabbitMQНазначение. ОбработчикОпределенияПолучателей узла ОтправкаВсем оставим пустым.
Так как в узле ОтправкаВсем обработчик события ОбработчикОпределенияПолучателей отсутствует, сообщение будет параллельно и независимо отправлено в узлы HTTP и RabbitMQНазначение.
Такой способ маршрутизации нужен тогда, когда одно и то же сообщение надо отправить сразу по нескольким независимым веткам, чтобы в каждой из них оно обрабатывалось независимо.
В данном случае мы независимо обращаемся к двум разным информационным системам (передаем им сообщение), пытаемся получить от них ответ и обработать его (эта часть схемы здесь не показана).
Выбор получателя
Есть следующий процесс интеграции: Вход — это программный источник, при помощи которого можно отправить сообщение в этот процесс интеграции программно. Например, из обработчика HTTP-сервиса.
Из программного источника сообщение попадает в маршрутизатор по содержимому ОпределениеВерсии. В зависимости от того, какое значение имеет параметр сообщения Формат, маршрутизатор направляет его либо на трансформацию, либо сразу в канал V2.
Обработчик события ОбработчикОпределенияПолучателей выглядит следующим образом:
метод ТрансформироватьИлиНет(Контекст: КонтекстВызова,
Сообщение: МаршрутизаторПример2.Сообщение): Коллекция<УзелСхемы>
пер СледующийУзел = Сообщение.ПолучитьПараметр("Формат") == 1
? Схема.Узлы.Трансформация
: Схема.Узлы.V2
возврат [СледующийУзел]
;
Если формат равен 1, то сообщение отправляется в узел Трансформация, иначе — в узел V2.
Балансировка нагрузки
Например, существует интенсивный поток сообщений, которые приходят в Канал1СНазначение. Схема процесса выглядит следующим образом:
Но информационная система, которая получает сообщения через этот канал, не способна обрабатывать их достаточно быстро. При этом все входящие сообщения независимы друг от друга, и мы заинтересованы в том, чтобы распараллелить их обработку.
Тогда мы можем направить сообщения примерно равномерно в Канал1СНазначение1 и Канал1СНазначение2, а в информационной системе получать и обрабатывать сообщения из этих каналов параллельно. В таком случае процесс интеграции будет выглядеть следующим образом:
Сообщения приходят и попадают в узел БалансировкаНагрузкиНазначений. В нем в соответствии с генератором случайных чисел выбирается один из двух узлов Канал1СНазначение1 или Канал1СНазначение2, в которые сообщение отправляется.
В результате сообщения попадают в разные каналы и обрабатываются независимо в системах получателей.
Обработчик события ОбработчикОпределенияПолучателей выглядит следующим образом:
метод Балансировка(Контекст: КонтекстВызова,
Сообщение: МаршрутизаторПример3.Сообщение): Коллекция<УзелСхемы>
пер Генератор = новый СлучайныйГенератор()
пер СледующийУзел = Генератор.СлучайноеЧисло(0, 1) > 0.5
? Схема.Узлы.Канал1СНазначение1
: Схема.Узлы.Канал1СНазначение2
возврат [СледующийУзел]
;
См. также Свойства узла процесса интеграции вида «МаршрутизаторПоСодержимому».