Как организовать мероприятие из очереди сервисной шины Azure в несколько тем?
В моем приложении у меня есть сценарий, где есть события, которые генерируются постоянно, каждое событие связано с типом.
Для каждого события должно быть выполнено несколько дополнительных действий в зависимости от типа, которые полностью независимы.
Так что для этого сценария решение, о котором я подумал, заключается в использовании очереди вместе с темами, как показано ниже
Генератор событий ---> Очередь -----> Orchestrator --------> themes <----- Слушатели
Для реализации вышесказанного необходимо иметь оркестратор, который получает события из очереди, применяет некоторую логику и вставляет их в темы.
Кто-нибудь может предложить какой-нибудь хороший компонент для оркестра на лазури?
Orchestrator должен уметь справляться с нагрузкой (ожидаются пики) - поскольку мы используем обработку очередей, событие не обязательно должно быть в реальном времени, оно может быть отложено в зависимости от нагрузки.
1 ответ
У меня есть два варианта для вас.
I. Экспедиция на автобусе
Если правила пересылки просты (например, основаны на значении свойства), вы можете установить это с помощью подписок и пересылки фильтра шины обслуживания.
Вы создаете входную тему, которая будет получать все сообщения. Затем вы создаете подписку для этой темы для каждого типа сообщений и применяете фильтр для этой подписки, чтобы отфильтровать все остальные типы. Затем вы настраиваете правило пересылки для отправки сообщений в соответствующую исходящую тему:
var description = new SubscriptionDescription("IngressTopic", "Type1");
description.ForwardTo = "SinkType1Topic";
SqlFilter filter = new SqlFilter("Type = 1");
namespaceManager.CreateSubscription(description, filter);
где Type
это свойство в вашем сообщении. Вы повторяете это для каждого типа.
II. Функция Azure
Если вам нужно запустить собственный код, чтобы определить, к какой исходящей теме относится сообщение, вы можете запустить этот пользовательский код как функцию Azure. Просто создайте входящую очередь и создайте функцию, которая будет прослушивать эту очередь, получать сообщение и пересылать его в соответствующую исходящую тему:
public static void Run(MyMessage message, IBinder binder)
{
string outgoingTopic = message.CalculateOutgoingTopic();
var attribute = new ServiceBusAttribute(outgoingTopic);
var collector = binder.Bind<ICollector<MyMessage>>(attribute);
collector.Add(message);
}
Функции Azure хороши для обработки колючей нагрузки.