Akce a filtry témat

Odběratelé mohou definovat zprávy, které chtějí z tématu přijímat. Tyto zprávy se určují ve formě jednoho nebo více pojmenovaných pravidel odběru. Každé pravidlo se skládá z podmínky filtru, která vybere konkrétní zprávy, a volitelně obsahuje akci , která označí vybranou zprávu.

Všechna pravidla bez akcí se zkombinují pomocí OR podmínky a výsledkem je jedna zpráva v předplatném, i když máte více odpovídajících pravidel.

Každé pravidlo s akcí vytvoří kopii zprávy. Tato zpráva bude mít vlastnost volanou RuleName , kde hodnota je název odpovídajícího pravidla. Akce může přidat nebo aktualizovat vlastnosti nebo odstranit vlastnosti z původní zprávy a vytvořit zprávu v odběru.

Představte si následující scénář, ve kterém má předplatné pět pravidel: dvě pravidla s akcemi a další tři bez akcí. Pokud v tomto příkladu odešlete jednu zprávu, která odpovídá všem pěti pravidlům, dostanete tři zprávy v odběru. To jsou dvě zprávy pro dvě pravidla s akcemi a jedna zpráva pro tři pravidla bez akcí.

Každé nově vytvořené předplatné tématu má počáteční výchozí pravidlo předplatného. Pokud pro pravidlo explicitně nezadáte podmínku filtru, použije se filtr true , který umožňuje výběr všech zpráv do odběru. Výchozí pravidlo nemá přidruženou akci poznámky.

Poznámka:

Tento článek se týká scénářů, které nejsou JMS. Pro scénáře JMS použijte selektory zpráv.

Filtry

Service Bus podporuje tři typy filtrů:

  • Filtry SQL
  • Logické filtry
  • Korelační filtry

Následující části obsahují podrobnosti o těchto filtrech.

Filtry SQL

SqlFilter obsahuje podmíněný výraz podobný SQL, který bude vyhodnocen ve zprostředkovateli proti vlastnostem definovaným uživatelem definovaným zprávám a vlastnostem systému. Všechny systémové vlastnosti musí být v podmíněném výrazu předponou sys. . Podmnožina jazyka SQL pro podmínky filtru testuje existenci vlastností (EXISTS), null-values (IS NULL), logickéAND//NOTOR , relační operátory, jednoduché číselné aritmetické a jednoduché textové vzory odpovídající .LIKE

Tady je příklad .NET pro definování filtru SQL:

adminClient = new ServiceBusAdministrationClient(connectionString);    

// 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;")
}

Logické filtry

TrueFilter a FalseFilter buď způsobí, že budou pro odběr vybrány všechny příchozí zprávy (true), nebo žádná z příchozích zpráv (false). Tyto dva filtry jsou odvozeny z filtru SQL.

Tady je příklad .NET pro definování logického filtru:

// 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()));	

Korelační filtry

CorrelationFilter obsahuje sadu podmínek, které se shodují s jednou nebo více vlastnostmi uživatele a systému příchozí zprávy. Běžným použitím je porovnávání s vlastností CorrelationId , ale aplikace se může také rozhodnout, jestli se má shodovat s následujícími vlastnostmi:

  • ContentType
  • Label
  • MessageId
  • ReplyTo
  • ReplyToSessionId
  • SessionId
  • To
  • všechny uživatelem definované vlastnosti.

Shoda existuje, pokud je hodnota příchozí zprávy pro vlastnost rovna hodnotě zadané ve filtru korelace. U řetězcových výrazů se při porovnávání rozlišují malá a velká písmena. Pokud zadáte více vlastností shody, filtr je zkombinuje jako logickou podmínku AND, což znamená, že filtr se má shodovat, musí se shodovat všechny podmínky.

Tady je příklad .NET pro definování filtru korelace:

// 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 Použijte konstruktor, který přebírá String argument k vytvoření filtru korelace s ID korelace.

Při použití výchozího konstruktoruCorrelationRuleFiltermůžete přiřadit systémové vlastnosti (ContentType, Label, MessageId, ReplyToReplyToSessionId, , SessionIdTo) a uživatelsky definované vlastnosti pro filtrování. Chcete-li zadat uživatelem definované vlastnosti pro korelační filtr, použijte vlastnost Properties typu IDictionary <string, object>. Klíče pro tento slovník jsou uživatelem definované vlastnosti, které se mají vyhledat ve zprávách. Hodnoty přidružené ke klíčům jsou hodnoty, se kterými se mají korelovat. Tady je příklad.

var filter = new CorrelationFilter();
filter.Label = "abc";
filter.ReplyTo = "xdeu@hotmail.com";
filter.Properties["prop1"] = "abc";
filter.Properties["prop2"] = "xyz";

Poznámka:

  • Všechny filtry vyhodnocují vlastnosti zprávy. Filtry nemůžou vyhodnotit text zprávy.
  • Složitá pravidla filtru vyžadují kapacitu zpracování. Konkrétně použití pravidel filtru SQL způsobuje nižší celkovou propustnost zpráv na úrovni odběru, tématu a oboru názvů. Kdykoli je to možné, měli by aplikace zvolit filtry korelace oproti filtrům podobných SQL, protože jsou mnohem efektivnější při zpracování a mají menší dopad na propustnost.

Akce

Pomocí podmínek filtru SQL můžete definovat akci, která může zprávu přidávat, odebírat nebo nahrazovat vlastnosti a jejich hodnoty. Akce používá výraz podobný JAZYKu SQL, který volně spoléhá na SQL UPDATE syntaxi příkazu. Akce se provede na zprávě, jakmile bude spárována a před vybránou zprávou do odběru. Změny vlastností zprávy jsou soukromé pro zprávu zkopírovanou do odběru.

Tady je příklad .NET, který vytvoří pravidlo SQL s akcí, která aktualizuje množství, když je barva červená.

adminClient = new ServiceBusAdministrationClient(connectionString);    

// 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;")
}

Vzory využití

  • Model všesměrového vysílání

    Nejjednodušší scénář použití tématu spočívá v tom, že každé předplatné získá kopii každé zprávy odeslané do tématu, což umožňuje vzor vysílání.

  • Model dělení

    Dělení používá filtry k distribuci zpráv mezi několik stávajících odběrů témat předvídatelným a vzájemně se vylučující způsobem. Model dělení se používá při horizontálním navýšení kapacity systému pro zpracování mnoha různých kontextů v funkčně identických oddílech, které každý obsahuje podmnožinu celkových dat; Například informace o profilu zákazníka. Při dělení odešle vydavatel zprávu do tématu, aniž by vyžadoval jakékoli znalosti modelu dělení. Zpráva se pak přesune do správného předplatného, ze kterého ji pak může načíst obslužná rutina zprávy oddílu.

  • Model směrování

    Směrování používá filtry k distribuci zpráv mezi odběry témat předvídatelným způsobem, ale nemusí nutně být exkluzivní. Ve spojení s funkcí automatického předávání je možné použít filtry témat k vytvoření složitých směrovacích grafů v rámci oboru názvů služby Service Bus pro distribuci zpráv v rámci oblasti Azure. Azure Functions nebo Azure Logic Apps fungují jako most mezi obory názvů služby Azure Service Bus a můžete vytvářet složité globální topologie s přímou integrací do obchodních aplikací.

Poznámka:

Vzhledem k tomu, že Azure Portal teď podporuje funkce Service Bus Exploreru, můžete z portálu vytvořit nebo upravit filtry předplatného.

Další kroky

Další příklady najdete v příkladech filtru služby Service Bus.