Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Подписчики могут самостоятельно определять, какие сообщения они хотят получать из раздела. Укажите эти сообщения в виде одного или нескольких именованных правил подписки. Каждое правило состоит из условия фильтра, которое выбирает определенные сообщения и при необходимости содержит действие , которое заметит выбранное сообщение.
Все правила без действий объединяются с помощью OR условия и приводят к одному сообщению в подписке, даже если у вас несколько правил сопоставления.
Каждое правило с действием создает копию сообщения. Это сообщение имеет свойство, называемое RuleName, в котором значение является именем соответствующего правила. Действие может добавлять или обновлять свойства или удалять свойства из исходного сообщения, чтобы создать сообщение в подписке.
Рассмотрим следующий сценарий, когда подписка имеет пять правил: два правила с действиями и другими тремя без действий. В этом примере при отправке одного сообщения, соответствующего всем пяти правилам, вы получите три сообщения в подписке. Это два сообщения для двух правил с действиями и одно сообщение для трех правил без действий.
Каждая новая подписка на тему имеет правило подписки по умолчанию. Если явно не указать условие фильтра для правила, примененный фильтр является истинным фильтром, который позволяет выбирать все сообщения в подписку. Правило по умолчанию не имеет связанного с ним действия аннотации.
Примечание
Эта статья относится к сценариям, отличным от Java Message Service (JMS). В сценариях JMS используйте селекторы сообщений.
Фильтры
Сервисная шина поддерживает три типа фильтров:
- Фильтры SQL
- Логические фильтры
- Фильтры корреляции
В следующих разделах содержатся сведения об этих фильтрах.
Фильтры SQL
SqlFilter содержит такое условное выражение SQL, которое брокер оценивает по определяемым пользователем свойствам и системным свойствам поступающих сообщений. Все системные свойства должны быть префиксированы в sys. условном выражении.
Подмножество языка SQL для проверки условий фильтрации тестирует существование свойств (EXISTS), значений NULL (IS NULL), логические NOT/AND/OR операторов, реляционные операторы, простые числовые арифметические действия, и простые текстовые шаблоны, совпадающие с LIKE.
Ниже приведен пример .NET для определения фильтра SQL:
adminClient = new ServiceBusAdministrationClient(fullyQualifiedNamespace, new DefaultAzureCredential());
// Create a SQL filter with color set to blue and quantity to 10
await adminClient.CreateSubscriptionAsync(
new CreateSubscriptionOptions(topicName, "ColorBlueSize10Orders"),
new CreateRuleOptions("BlueSize10Orders", new SqlRuleFilter("color='blue' AND quantity=10")));
// Create a SQL filter with color set to red
// Action is defined to set the quantity to half if the color is red
await adminClient.CreateRuleAsync(topicName, "ColorRed", new CreateRuleOptions
{
Name = "RedOrdersWithAction",
Filter = new SqlRuleFilter("user.color='red'"),
Action = new SqlRuleAction("SET quantity = quantity / 2;")
}
Логические фильтры
TrueFilter и FalseFilter работают в качестве логических фильтров. TrueFilter выбирает все поступающие сообщения для подписки, а FalseFilter не выбирает ни одно из поступающих сообщений. Эти два фильтра являются производными от фильтра SQL.
Ниже приведен пример .NET для определения логического фильтра:
// Create a True Rule filter with an expression that always evaluates to true
// It's equivalent to using SQL rule filter with 1=1 as the expression
await adminClient.CreateSubscriptionAsync(
new CreateSubscriptionOptions(topicName, subscriptionAllOrders),
new CreateRuleOptions("AllOrders", new TrueRuleFilter()));
Фильтры корреляции
CorrelationFilter содержит набор условий, которые проверяются по отношению к одному или нескольким пользовательским и системным свойствам входящего сообщения. Обычно используется сопоставление со свойством CorrelationId , но приложение также может выбрать сопоставление со следующими свойствами:
ContentTypeLabelMessageIdReplyToReplyToSessionIdSessionIdTo- любые определяемые пользователем свойства.
Совпадение существует, когда значение возвращаемого сообщения для свойства равно значению, указанному в фильтре корреляции. При сравнении строковых выражений учитывается чувствительность к регистру. При указании нескольких свойств соответствия фильтр объединяет их как логическое условие И, что означает, что фильтр сработает только в случае соответствия всем условиям.
Ниже приведен пример .NET для определения фильтра корреляции:
// Create a correlation filter with color set to Red and priority set to High
await adminClient.CreateSubscriptionAsync(
new CreateSubscriptionOptions(topicName, "HighPriorityRedOrders"),
new CreateRuleOptions("HighPriorityRedOrdersRule", new CorrelationRuleFilter() {Subject = "red", CorrelationId = "high"} ));
CorrelationRuleFilter Используйте конструктор, который принимает String аргумент для создания фильтра корреляции с идентификатором корреляции.
При использовании конструктораCorrelationRuleFilter по умолчанию можно назначать системные свойства (ContentType, , LabelMessageId, ReplyToReplyToSessionId, , SessionIdTo) и пользовательские свойства для фильтрации. Чтобы указать определяемые пользователем свойства для фильтра корреляции, используйте свойство Properties типа IDictionary <string, object>. Ключи этого словаря — это определяемые пользователем свойства для поиска сообщений. Значения, связанные с ключами, — это значения для сопоставления. Приведем пример.
var filter = new CorrelationFilter();
filter.Label = "abc";
filter.ReplyTo = "xdeu@hotmail.com";
filter.Properties["prop1"] = "abc";
filter.Properties["prop2"] = "xyz";
Примечание
- Все фильтры оценивают свойства сообщения. Фильтры не могут оценить текст сообщения.
- Для сложных правил фильтрации требуется емкость обработки. В частности, использование правил фильтра SQL приводит к снижению общей пропускной способности сообщений на уровне подписки, раздела и пространства имен. По возможности приложения должны выбирать фильтры корреляции по сравнению с такими фильтрами SQL, так как они гораздо эффективнее в обработке и имеют меньше влияния на пропускную способность.
Действия
С помощью условий фильтра SQL можно определить действие, которое анимирует сообщение, добавив, удалив или заменив свойства и их значения. В действии используется такое выражение SQL , которое слабо зависит от синтаксиса инструкции SQL UPDATE . Действие выполняется над сообщением после того, как оно соответствует условию, и до того, как сообщение будет выбрано в подписку. Изменения свойств сообщения являются закрытыми для сообщения, скопированного в подписку.
Ниже приведен пример .NET, который создает правило SQL с действием для обновления количества, когда цвет красный.
adminClient = new ServiceBusAdministrationClient(fullyQualifiedNamespace, new DefaultAzureCredential());
// Create a SQL filter with color set to red
// Action is defined to set the quantity to half if the color is red
await adminClient.CreateRuleAsync(topicName, "ColorRed", new CreateRuleOptions
{
Name = "RedOrdersWithAction",
Filter = new SqlRuleFilter("user.color='red'"),
Action = new SqlRuleAction("SET quantity = quantity / 2;")
}
Важно
При обновлении системных свойств с помощью действий правил можно изменить ожидаемое поведение. Некоторые свойства оцениваются только при получении сообщения в очереди или разделе. Поэтому, когда вы обновляете эти свойства в действии правила и затем интегрируете их в подписку, они игнорируются. Хотя при автоматической переадресации в другую очередь или тему они повторно оцениваются.
- ScheduledEnqueueTime: при установке или обновлении этого свойства он игнорируется в подписке.
- MessageID с дедупликацией: Дедупликация не предусмотрена в подписке при обновлении MessageID, что приводит к появлению дубликатов.
- SessionID с секционированием. В этом сценарии идентификатор сеанса является ключом секции для секционированных сущностей и используется для выбора секции, в которую отправляется сообщение. Изменение sessionID в действии правила означает изменение ключа секции после доставки сообщения в секцию. В результате потребитель может не получать некоторые из этих сообщений в сеансе. Даже если потребитель получает сообщение, создается впечатление, что оно приходит из неверного раздела из-за измененного ключа раздела.
Шаблоны использования
Шаблон трансляции
Самый простой сценарий использования для раздела заключается в том, что каждая подписка получает копию каждого сообщения, отправленного в раздел, что позволяет шаблоны трансляции.
Шаблон секционирования
Секционирование использует фильтры для распространения сообщений между несколькими существующими подписками раздела предсказуемым и взаимоисключающим способом. Используйте шаблон секционирования при горизонтальном масштабировании системы для обработки множества различных контекстов в функционально идентичных секциях, которые каждый содержит подмножество общих данных. Например, сведения о профиле клиента. При секционировании издатель отправляет сообщение в тему, не имея представления о модели разделения. Затем сообщение перемещается в правильную подписку, из которой его можно получить обработчиком сообщений раздела.
Шаблон маршрутизации
Маршрутизация использует фильтры для распространения сообщений между подписками тем в прогнозируемом режиме, но не обязательно эксклюзивным. В сочетании с функцией автоматического переадресации фильтры разделов можно использовать для создания сложных графов маршрутизации в пространстве имен служебной шины для распространения сообщений в регионе Azure. Используя Функции Azure или Azure Logic Apps в качестве моста между пространствами имен служебной шины Azure, можно создавать сложные глобальные топологии с прямой интеграцией в бизнес-приложения.
Примечание
Так как портал Azure теперь поддерживает функции Service Bus Explorer, вы можете создавать или изменять фильтры подписок на портале.
Дальнейшие шаги
Дополнительные примеры см. в примерах фильтров служебной шины.