Ämnesfilter och åtgärder

Prenumeranter kan definiera vilka meddelanden som de vill ta emot från ett ämne. Dessa meddelanden anges i form av en eller flera namngivna prenumerationsregler. Varje regel består av ett filtervillkor som väljer specifika meddelanden och som eventuellt innehåller en åtgärd som kommenterar det valda meddelandet.

Alla regler utan åtgärder kombineras med ett OR villkor och resulterar i ett enda meddelande i prenumerationen även om du har flera matchande regler.

Varje regel med en åtgärd skapar en kopia av meddelandet. Det här meddelandet har en egenskap som heter RuleName där värdet är namnet på den matchande regeln. Åtgärden kan lägga till eller uppdatera egenskaper eller ta bort egenskaper från det ursprungliga meddelandet för att skapa ett meddelande i prenumerationen.

Föreställ dig följande scenario:

  • Prenumerationen har fem regler.
  • Två regler innehåller åtgärder.
  • Tre regler innehåller inte åtgärder.

I det här exemplet får du tre meddelanden i prenumerationen om du skickar ett meddelande som matchar alla fem reglerna. Det är två meddelanden för två regler med åtgärder och ett meddelande för tre regler utan åtgärder.

Varje nyligen skapad ämnesprenumeration har en första standardprenumerationsregel. Om du inte uttryckligen anger ett filtervillkor för regeln är det tillämpade filtret det sanna filtret som gör att alla meddelanden kan väljas i prenumerationen. Standardregeln har ingen associerad anteckningsåtgärd.

Filter

Service Bus stöder tre filtervillkor:

  • SQL-filter – Ett SqlFilter innehåller ett SQL-liknande villkorsuttryck som utvärderas i den asynkrona meddelandekön mot de inkommande meddelandenas användardefinierade egenskaper och systemegenskaper. Alla systemegenskaper måste föregås av sys. i villkorsuttrycket. Sql-språkdeluppsättningen för filtervillkor testar förekomsten av egenskaper (EXISTS), null-värden (IS NULL), logiska NOT/AND/OR, relationsoperatorer, enkla numeriska aritmetiska och enkla textmönster som matchar med LIKE.

    .NET-exempel för att definiera ett SQL-filter:

    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;")
    }
    
  • Booleska filterTrueFilter och FalseFilter gör antingen att alla inkommande meddelanden (sant) eller inget av de inkommande meddelandena (falskt) väljs för prenumerationen. Dessa två filter härleds från SQL-filtret.

    .NET-exempel för att definiera ett booleskt filter:

    // 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()));	
    
  • Korrelationsfilter – Ett korrelationsfilter innehåller en uppsättning villkor som matchas mot ett eller flera av det inkommande meddelandets användar- och systemegenskaper. En vanlig användning är att matcha mot egenskapen CorrelationId , men programmet kan också välja att matcha mot följande egenskaper:

    • Contenttype
    • Etikett
    • Messageid
    • ReplyTo
    • ReplyToSessionId
    • Sessionid
    • Till
    • användardefinierade egenskaper.

    Det finns en matchning när ett inkommande meddelandes värde för en egenskap är lika med det värde som anges i korrelationsfiltret. För stränguttryck är jämförelsen skiftlägeskänslig. Om du anger flera matchningsegenskaper kombinerar filtret dem som ett logiskt AND-villkor, vilket innebär att alla villkor måste matcha för att filtret ska matcha.

    .NET-exempel för att definiera ett korrelationsfilter:

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

Alla filter utvärderar meddelandeegenskaper. Filter kan inte utvärdera meddelandetexten.

Komplexa filterregler kräver bearbetningskapacitet. I synnerhet orsakar användningen av SQL-filterregler lägre övergripande meddelandegenomflöde på prenumerations-, ämnes- och namnområdesnivå. När det är möjligt bör program välja korrelationsfilter framför SQL-liknande filter eftersom de är mycket effektivare vid bearbetning och har mindre inverkan på dataflödet.

Åtgärder

Med SQL-filtervillkor kan du definiera en åtgärd som kan kommentera meddelandet genom att lägga till, ta bort eller ersätta egenskaper och deras värden. Åtgärden använder ett SQL-liknande uttryck som löst lutar sig mot syntaxen för SQL UPDATE-instruktionen. Åtgärden utförs i meddelandet när det har matchats och innan meddelandet väljs i prenumerationen. Ändringarna i meddelandeegenskaperna är privata för det meddelande som kopieras till prenumerationen.

.NET-exempel:

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

Användningsmönster

Det enklaste användningsscenariot för ett ämne är att varje prenumeration får en kopia av varje meddelande som skickas till ett ämne, vilket möjliggör ett sändningsmönster.

Filter och åtgärder möjliggör ytterligare två grupper av mönster: partitionering och routning.

Partitionering använder filter för att distribuera meddelanden över flera befintliga ämnesprenumerationer på ett förutsägbart och ömsesidigt uteslutande sätt. Partitioneringsmönstret används när ett system skalas ut för att hantera många olika kontexter i funktionellt identiska fack som var och en innehåller en delmängd av övergripande data. till exempel kundprofilinformation. Med partitionering skickar en utgivare meddelandet till ett ämne utan att det krävs någon kunskap om partitioneringsmodellen. Meddelandet flyttas sedan till rätt prenumeration som det sedan kan hämtas från av partitionens meddelandehanterare.

Routning använder filter för att distribuera meddelanden mellan ämnesprenumerationer på ett förutsägbart sätt, men inte nödvändigtvis exklusivt. Tillsammans med funktionen för automatisk vidarebefordring kan ämnesfilter användas för att skapa komplexa routningsdiagram inom ett Service Bus-namnområde för meddelandedistribution inom en Azure-region. Med Azure Functions eller Azure Logic Apps som en brygga mellan Azure Service Bus namnrymder kan du skapa komplexa globala topologier med direkt integrering i verksamhetsspecifika program.

Exempel

Exempel finns i Service Bus-filterexempel.

Anteckning

Eftersom Azure Portal nu stöder Service Bus Explorer-funktioner kan prenumerationsfilter skapas eller redigeras från portalen.

Nästa steg

Prova exemplen på det språk du väljer för att utforska Azure Service Bus funktioner.

Hitta exempel för de äldre .NET- och Java-klientbiblioteken nedan: