Megosztás a következőn keresztül:


Témakörszűrők és -műveletek

Az előfizetők meghatározhatják, hogy mely üzeneteket szeretnék megkapni egy témakörön belül. Ezen üzenetek egy vagy több névvel ellátott előfizetési szabály formájában adhatók meg. Minden szabály egy szűrőfeltételből áll, amely kiválasztja az adott üzeneteket, és opcionálisan tartalmaz egy műveletet , amely széljegyzeteket ad a kijelölt üzenetnek.

A művelet nélküli szabályok egy OR feltétel használatával vannak kombinálva, és egyetlen üzenetet eredményeznek az előfizetésen, még akkor is, ha több egyező szabálysal rendelkezik.

Minden művelettel rendelkező szabály másolatot készít az üzenetről. Ebben az üzenetben egy tulajdonság lesz meghívva RuleName , ahol az érték az egyező szabály neve. A művelet hozzáadhat vagy frissíthet tulajdonságokat, vagy törölheti az eredeti üzenet tulajdonságait, hogy üzenetet jelenítsen meg az előfizetésben.

Fontolja meg a következő forgatókönyvet, amelyben egy előfizetésnek öt szabálya van: két szabály műveletekkel, a másik három művelet nélkül. Ebben a példában, ha mind az öt szabálynak megfelelő üzenetet küld, három üzenetet kap az előfizetésben. Ez két üzenet két művelettel rendelkező szabályhoz, egy pedig három, művelet nélküli szabályhoz.

Minden újonnan létrehozott témakör-előfizetéshez tartozik egy kezdeti alapértelmezett előfizetési szabály. Ha nem ad meg explicit módon szűrési feltételt a szabályhoz, az alkalmazott szűrő az igazi szűrő, amely lehetővé teszi az összes üzenet kijelölését az előfizetésben. Az alapértelmezett szabály nem rendelkezik kapcsolódó széljegyzetműveletekkel.

Feljegyzés

Ez a cikk nem JMS-forgatókönyvekre vonatkozik. JMS-forgatókönyvek esetén használjon üzenetválasztókat.

Szűrők

A Service Bus három szűrőtípust támogat:

  • SQL-szűrők
  • Logikai szűrők
  • Korrelációs szűrők

A következő szakaszok részletesen ismertetik ezeket a szűrőket.

SQL-szűrők

Az SqlFilter tartalmaz egy SQL-szerű feltételes kifejezést, amelyet a rendszer kiértékel a közvetítőben az érkező üzenetek felhasználó által definiált tulajdonságai és rendszertulajdonságai alapján. Minden rendszertulajdonságnak előtaggal sys. kell rendelkeznie a feltételes kifejezésben. A szűrőfeltételek SQL-nyelvi részhalmaza a tulajdonságok (), null értékek (EXISTSIS NULL), logikaiANDOR/NOT/, relációs operátorok, egyszerű numerikus számtani és egyszerű szöveges minta LIKEmeglétét teszteli.

Íme egy .NET-példa egy SQL-szűrő meghatározására:

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

Logikai szűrők

A TrueFilter és a FalseFilter hatására az összes érkező üzenet (igaz), vagy az érkező üzenetek egyike sem (hamis) lesz kiválasztva az előfizetéshez. Ez a két szűrő az SQL-szűrőből származik.

Íme egy .NET-példa logikai szűrő meghatározására:

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

Korrelációs szűrők

A CorrelationFilter olyan feltételeket tartalmaz, amelyek megfelelnek egy vagy több érkező üzenet felhasználói és rendszertulajdonságainak. Gyakran használják a Korrelációs azonosító tulajdonsággal való egyezést, de az alkalmazás a következő tulajdonságoknak is megfeleltethető:

  • ContentType
  • Label
  • MessageId
  • ReplyTo
  • ReplyToSessionId
  • SessionId
  • To
  • felhasználó által definiált tulajdonságok.

Egyezés akkor létezik, ha egy érkező üzenet értéke egy tulajdonság esetében megegyezik a korrelációs szűrőben megadott értékkel. A sztringkifejezések esetében az összehasonlítás megkülönbözteti a kis- és nagybetűket. Ha több egyezési tulajdonságot ad meg, a szűrő logikai ÉS feltételként egyesíti őket, ami azt jelenti, hogy a szűrőnek egyeznie kell, minden feltételnek egyeznie kell.

Íme egy .NET-példa korrelációs szűrő meghatározására:

// 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 Az argumentumot String használó konstruktor használatával korrelációs szűrőt hozhat létre korrelációs azonosítóval.

Az alapértelmezett konstruktor használatakor rendszertulajdonságokat (ContentType, , Label, MessageId, ReplyTo, ReplyToSessionId, ), SessionIdToés felhasználó által definiált tulajdonságokat rendelhet hozzá a szűréshez.CorrelationRuleFilter A korrelációs szűrő felhasználó által definiált tulajdonságainak megadásához használja a típus IDictionary <string, object>tulajdonságátProperties. A szótár kulcsai a felhasználó által definiált tulajdonságok, amelyek az üzenetekre keresnek. A kulcsokhoz társított értékek azok az értékek, amelyeken korrelálni kell. Íme egy példa.

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

Feljegyzés

  • Minden szűrő kiértékeli az üzenet tulajdonságait. A szűrők nem tudják kiértékelni az üzenet törzsét.
  • Az összetett szűrőszabályok feldolgozási kapacitást igényelnek. Az SQL-szűrőszabályok használata különösen az előfizetés, a témakör és a névtér szintjén csökkenti az üzenetek általános átviteli sebességét. Amikor csak lehetséges, az alkalmazásoknak az SQL-hez hasonló szűrőkkel kell korrelációs szűrőket választaniuk, mivel sokkal hatékonyabbak a feldolgozásban, és kevésbé befolyásolják az átviteli sebességet.

Műveletek

Az SQL-szűrőfeltételekkel olyan műveletet határozhat meg, amely a tulajdonságok és azok értékeinek hozzáadásával, eltávolításával vagy cseréjével megjegyzéseket fűzhet az üzenethez. A művelet egy SQL-szerű kifejezést használ, amely lazán támaszkodik az SQL UPDATE utasítás szintaxisára. A művelet a megfeleltetés után és az üzenet előfizetésbe való kiválasztása előtt történik. Az üzenet tulajdonságainak módosítása privát az előfizetésbe másolt üzeneten.

Íme egy .NET-példa, amely létrehoz egy SQL-szabályt egy művelettel, amely frissíti a mennyiséget, ha a szín piros.

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

Fontos

Ha szabályműveletekkel frissíti a rendszertulajdonságokat, vegye figyelembe, hogy ez megváltoztathatja a várt viselkedést. Egyes tulajdonságok csak akkor lesznek kiértékelve, ha üzenet érkezik egy üzenetsorba vagy egy témakörbe. Ezért ha ezeket a tulajdonságokat egy szabályműveletben frissíti, majd egy előfizetésben kézbesíti őket, a rendszer figyelmen kívül hagyja őket. Bár az automatikus továbbítás egy másik üzenetsorba vagy témakörbe történik, a rendszer újra kiértékeli őket.

  • ScheduledEnqueueTime: A tulajdonság beállításakor vagy frissítésekor a rendszer figyelmen kívül hagyja az előfizetésben.
  • MessageID deduplikációval: Az előfizetésben nem történik deduplikáció, amikor a MessageID frissül, és ismétlődő eredményt ad.
  • Munkamenet-azonosító particionálással: Ebben a forgatókönyvben a munkamenet-azonosító a particionált entitások partíciókulcsa, és annak a partíciónak a eldöntésére szolgál, amelybe az üzenetet küldi. Ha módosítja a munkamenet-azonosítót egy szabályműveletben, az azt jelenti, hogy a partíciókulcs megváltozik, miután egy üzenet egy partíción landolt. Ennek eredményeképpen előfordulhat, hogy a fogyasztó nem kap néhány ilyen üzenetet a munkamenetben. Még akkor is, ha a fogyasztó megkapja az üzenetet, úgy tűnik, mintha a módosított partíciókulcs miatt nem a megfelelő partícióról érkeznének.

Használati minták

  • Szórási minta

    Egy témakör legegyszerűbb használati forgatókönyve, hogy minden előfizetés megkapja a témakörnek küldött üzenetek másolatát, ami lehetővé teszi a közvetítési mintát.

  • Particionálási minta

    A particionálás szűrőkkel osztja el az üzeneteket több meglévő témakör-előfizetés között kiszámítható és kölcsönösen kizáró módon. A particionálási mintát akkor használják, ha a rendszer horizontális felskálázásával számos különböző kontextust kezelnek funkcionálisan azonos rekeszekben, amelyek mindegyike a teljes adatok egy részhalmazát tárolja; például az ügyfélprofil adatai. A particionálással a közzétevő a particionálási modell ismerete nélkül küldi el az üzenetet egy témakörbe. Az üzenet ezután a megfelelő előfizetésbe kerül, ahonnan a partíció üzenetkezelője lekérheti.

  • Útválasztási minta

    Az útválasztás szűrőkkel osztja el az üzeneteket a témakör-előfizetések között kiszámítható módon, de nem feltétlenül kizárólagos módon. Az automatikus továbbítási funkcióval együtt a témakörszűrők segítségével összetett útválasztási grafikonokat hozhat létre egy Service Bus-névtérben az üzenetek Azure-régión belüli terjesztéséhez. Mivel az Azure Functions vagy az Azure Logic Apps hídként működik az Azure Service Bus-névterek között, összetett globális topológiákat hozhat létre az üzletági alkalmazásokba való közvetlen integrációval.

Feljegyzés

Mivel az Azure Portal mostantól támogatja a Service Bus Explorer funkcióit, az előfizetési szűrők a portálról hozhatók létre vagy szerkeszthetők.

Következő lépések

További példákért tekintse meg a Service Bus szűrő példáit.