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ý se vyhodnocuje ve zprostředkovateli proti vlastnostem definovaným uživatelem definovaným příchozí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
//NOT
OR
, 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 konstruktoruCorrelationRuleFilter
můžete přiřadit systémové vlastnosti (ContentType
, Label
, MessageId
, ReplyTo
ReplyToSessionId
, , SessionId
To
) 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;")
}
Důležité
Při aktualizaci systémových vlastností pomocí akcí pravidel si všimněte, že může změnit očekávané chování. Některé vlastnosti se vyhodnocují pouze při přijetí zprávy ve frontě nebo tématu. Proto když tyto vlastnosti aktualizujete v akci pravidla a pak je doručíte v předplatném, budou ignorovány. I když se při automatickém přeposílání do jiné fronty nebo tématu znovu vyhodnotí.
- ScheduledEnqueueTime: Při nastavení nebo aktualizaci této vlastnosti se u předplatného ignoruje.
- MessageID s odstraněním duplicitních dat: V odběru se při aktualizaci ID zprávy neprovádí žádné odstranění duplicitních dat a výsledkem je duplicitní.
- ID relace s dělením: V tomto scénáři je ID relace klíčem oddílu pro dělené entity a slouží k rozhodnutí o oddílu, na který se zpráva odešle. Změna ID relace v akci pravidla znamená, že klíč oddílu se změní poté, co zpráva přistane do oddílu. V důsledku toho nemusí příjemce obdržet některé z těchto zpráv v relaci. I když příjemce obdrží zprávu, zdá se, že pochází z nesprávného oddílu kvůli změně klíče oddílu.
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.