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

Узел вида МаршрутизаторПоСодержимому предназначен для того, чтобы определять, в какие узлы из тех, что идут непосредственно за этим узлом, должны попасть сообщения. Для этого у узла есть событие ОбработчикОпределенияПолучателей, в котором вы на встроенном языке можете сформировать набор таких узлов. Если этот обработчик отсутствует, то сообщение будет отправлено во все узлы, которые идут сразу после этого узла.

У обработчика есть два параметра. Первый — это Контекст, он описывает, в каком узле происходит вызов. Второй — это Сообщение, которое нужно маршрутизировать. Его нельзя изменить, также как нельзя модифицировать параметры его заголовка.

Если этот обработчик вернет пустую коллекцию узлов, то сообщение никуда не будет доставлено.

Если в возвращаемом массиве будет хотя бы один неправильный получатель, сообщение продублируется в канал недоставленных сообщений, но будет отправлено всем правильным получателям.

Если при выполнении обработчика возникает неперехваченная ошибка, сообщение отправляется в канал недоставленных сообщений.

Отправка всем

Есть следующий процесс интеграции: сообщение генерируется таймером и попадает в узел ОтправкаВсем. Это маршрутизатор по содержимому, из которого сообщение попадает в узлы 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
    возврат [СледующийУзел]
;

См. также Свойства узла процесса интеграции вида «МаршрутизаторПоСодержимому».