Проблема архитектуры - Azure сервисная шина и гарантия заказа сообщений - PullRequest
0 голосов
/ 29 января 2020

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

Architecture

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

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

OrderCreated OrderUpdate 1 OrderUpdate 2 OrderClosed

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 29 января 2020

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

1 голос
/ 29 января 2020

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

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

Существуют также библиотеки (MassTransit, NServiceBus и др. c), которые могут вам помочь. NServiceBus реализует Process Manager с помощью функции, называемой Saga ( tutorial ), и MassTransit также имеет ее ( документация ).

...