Как организовать мероприятие из очереди сервисной шины 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 хороши для обработки колючей нагрузки.

Другие вопросы по тегам