Как отправить сообщение только на одну Azure подписку на служебную шину? - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть следующий сценарий: у меня есть 2 микросервиса, подписанных в служебной шине Azure, один микросервис для отправки уведомлений pu sh и другой для отправки электронных писем, эти микросервисы никогда не будут работать вместе, поэтому сообщение будет выполняться только одним микросервисом.

Я искал и, похоже, неплохо было бы отправить сообщение в Topi c и иметь фильтр для выбора того, какой микросервис должен выполнять операцию.

Так что я У меня есть два вопроса:

Должен ли я использовать темы и фильтры? Не уверен, что это лучшие практики.

Если да, существует ли способ отправить сообщение с правильной подпиской? Например, я публикую sh сообщение для подписки X вместо публикации для всех подписок.

enter image description here

Спасибо

1 Ответ

1 голос
/ 24 апреля 2020

Должен ли я использовать темы и фильтры? Не уверен, что это лучшие практики.

Да. Это классический вариант использования c для тем и подписок.

Если да, существует ли способ отправить сообщение правильной подписке? Например, я публикую sh сообщение для подписки X вместо публикации для всех подписок.

Способ публикации заключается в том, что вы публикуете sh в topi c, topi c принимает сообщения и проверяет фильтры по всем подпискам. Подписки с удовлетворяющими критериями фильтра получают сообщение. Подписки, не удовлетворяющие критериям фильтра, пропускаются. Существует три типа фильтров: Boolean, SQL и Correlation. Булевы фильтры менее актуальны для вас. Корреляционные или SQL фильтры сделают эту работу. Вы можете найти более подробную информацию о фильтрах в моем посте .

. Я бы предложил здесь "поставить отметку" в каждом сообщении методом уведомления. Поскольку вы собираетесь использовать один метод уведомления для каждого метода, корреляционный фильтр будет самым простым и эффективным. Значение метода уведомления может быть присвоено системному свойству Label исходящих сообщений и корреляционному фильтру в обеих подписках (одна для службы электронной почты и одна для служб уведомлений pu sh). Например (псевдокод):

var message = new Message();

// custom logic to determine what notification method to use

if (notificationMethod == NotificationMethod.Email)
{
  message.Label = "email";
}
else
{
  message.Label = "push";
}

// publish the message to the topic

И настройки двух фильтров будут следующими:

// email notification service subscription
var emailFilter = new CorrelationFilter();
filter.Label = "email";

// push notifications service subscription
var pushFilter = new new CorrelationFilter();
filter.Label = "push";

Создание подписки с данным фильтром (например, по электронной почте):

var management = new ManagementClient(...);
await management.CreateSubscriptionAsync(new SubscriptionDescription("topic", "subscription"));

var client = new SubscriptionClient("topic", "subscription");
await client.AddRuleAsync(new RuleDescription(
{
  Filter = emailFilter,
  Name = "email filter"
}));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...