Проблема с архитектурой - сервисная шина Azure и гарантия порядка сообщений

Хорошо, я относительно новичок в сервисной шине. Работаем над проектом, в котором мы используем сервисную шину Azure для постановки сообщений в очередь. Наша архитектура примерно выглядит следующим образом:

Архитектура

Идея состоит в том, что в нашей SourceSystem происходит множество разных вещей, что приводит к тому, что сообщения помещаются в сервисные приложения. Теперь наша ответственность - синхронизировать эти события с внешним клиентом, чтобы он знал, что мы делаем.

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

OrderCreated OrderUpdate 1 OrderUpdate 2 OrderClosed

Что происходит сейчас, если API внешних клиентов не работает, скажем, для OrderUpdate 1 и OrderUpdate 2, мы потенциально могли бы отправлять сообщения по порядку: OrderCreated, OrderClosed, OrderUpdate 1, OrderUpdate 2.

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

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

Должны ли мы заставить исходную систему помещать все сообщения для заказа в сеанс служебной шины? Но как мы можем справиться с этим с несколькими темами? И что нам делать, если сообщение 1 из сеанса оказывается в мертвом письме?

Здесь есть много соображений, следует ли использовать одну тему, чтобы было легче управлять сеансами? Но это открывает другие проблемы с разными структурами сообщений в одной теме?

Я хотел бы услышать ваше мнение по этому поводу


person Demoric    schedule 29.01.2020    source источник


Ответы (2)


Взгляните на Долговечные функции в Azure. Вы можете использовать «Async Http API» или один из других шаблонов для достижения необходимой вам оркестрации. Саги NServicebus также могут быть хорошим вариантом, вот статья, в которой очень хорошее сравнение между NServicebus и Долговечные функции.

person Kaptein Babbalas    schedule 29.01.2020

Если внешний клиент должен получать все эти события и вопросы по порядку, отправка этих сообщений в несколько тем, где тема относится к типу сообщения, сделает вашу миссию чрезвычайно сложной. Для упорядоченного обмена сообщениями сначала необходимо использовать один объект (очередь или тема) с Сеансы включены. Таким образом, вы можете гарантировать упорядоченную обработку сообщений. Если у вас несколько внешних клиентов, вам понадобится сущность (тема) с включенным сеансом для каждого внешнего клиента.

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

Также существуют библиотеки (MassTransit, NServiceBus и т. Д.), Которые могут вам помочь. NServiceBus реализует диспетчер процессов с помощью функции под названием Saga (учебник), а MassTransit имеет это как хорошо (документация).

person Sean Feldman    schedule 29.01.2020