Végrehajtásoptimalizálás az Azure Logic Apps szabálymotorhoz

A következőkre vonatkozik: Azure Logic Apps (Standard)

Ez az útmutató azokat az alapvető fogalmakat ismerteti, amelyek bemutatják, hogyan működik az Azure Logic Apps szabálymotorja a feltételek kiértékelése, a műveletek végrehajtása és a szabályok közötti ütközések feloldása során. Az Azure Logic Apps szabálymotorja biztosítja egy szabálykészlet végrehajtási környezetét, amelyet a Microsoft Rules Composerrel hoz létre.

Megismerheti a motor háromfázisú végrehajtási algoritmusát, azt, hogy a napirend és a prioritási rendszer hogyan határozza meg a szabály végrehajtási sorrendjét, és hogy a mellékhatások hogyan befolyásolják a gyorsítótárazási viselkedést. Ez az útmutató teljesítményoptimalizálási stratégiákat is tartalmaz, beleértve a ténytípusok, a logikai operátorok, a frissítési hívások és az osztályöröklés támogatásának kezelésére vonatkozó tippeket, így hatékonyan futtatható szabálykészleteket hozhat létre.

Alapösszetevők

  • Szabálykészlet-végrehajtó

    Ez az összetevő implementálja a szabályfeltételek kiértékeléséért és a műveletek végrehajtásáért felelős algoritmust. Az alapértelmezett szabálykészlet-végrehajtó egy hálózati alapú, továbbítási láncolású következtetési motor, amely a memóriabeli működés optimalizálására lett tervezve.

  • Szabálykészlet-fordító

    Ez az összetevő bemenetként egy RuleSet objektumot használ, és végrehajtható módon jeleníti meg a szabálykészletet. Az alapértelmezett memóriabeli fordító lefordított megkülönböztetési hálózatot hoz létre a szabálykészlet definíciójából.

  • Szabálykészlet-követési elfogó

    Ez az összetevő a szabálykészlet-végrehajtótól kapja a kimenetet, és továbbítja a kimenetet a szabálykészlet-követési és monitorozási eszközöknek.

Állapot kiértékelése és művelet végrehajtása

Az Azure Logic Apps szabálymotorja egy rendkívül hatékony következtetési motor, amely szabályokat csatolhat .NET-objektumokhoz vagy XML-dokumentumokhoz. A szabálymotor egy háromfázisú algoritmust használ a szabálykészletek végrehajtásához a következő fázisokkal:

  • Egyezés

    Az egyeztetési szakaszban a szabálymotor a szabályfeltételekben meghatározott predikátumok használatával összeveti a tényeket azokkal a predikátumokkal, amelyek a ténytípust használják. Ezek az objektumhivatkozások a szabálymotor munkamemóriájában vannak fenntartva. A hatékonyság érdekében a mintaegyeztetés a szabálykészlet összes szabályára kiterjed, és a szabályok között megosztott feltételek csak egyszer egyeznek meg. a szabálymotor részleges feltételegyezéseket tárolhat a munkamemóriában, hogy felgyorsítsa a mintaegyeztetési műveleteket. A mintaegyeztetési fázis kimenete tartalmazza a szabálymotor napirendjének frissítéseit.

  • Ütközésfeloldás

    Az ütközésfeloldási szakaszban a szabálymotor megvizsgálja a végrehajtásra jelölt szabályokat, hogy meghatározza a következő futtatandó szabályműveleteket egy előre meghatározott megoldási séma alapján. A szabálymotor a megfelelő szakasz során talált összes jelölt szabályt hozzáadja a szabálymotor napirendjére.

    Az alapértelmezett ütközésfeloldási séma a szabálykészleten belüli szabályprioritásokon alapul. A prioritás egy szabálytulajdonság, amelyet a Microsoft Rules Composerben konfigurálhat. Minél nagyobb a szám, annál magasabb a prioritás. Ha több szabály is aktiválódik, a szabálymotor először a magasabb prioritású műveleteket futtatja.

  • Művelet

    A műveleti szakaszban a szabálymotor a feloldott szabályban futtatja a műveleteket. A szabályműveletek új tényeket állíthatnak be a szabálymotorba, ami miatt a ciklus folytatódik, és továbbítási láncolásnak is nevezik.

    Fontos

    Az algoritmus soha nem előzi meg az éppen futó szabályt. A szabálymotor az éppen futó szabály összes végrehajtandó műveletét végrehajtja, mielőtt az egyeztetési fázis megismétlődik. A szabálymotor napirendjén szereplő egyéb szabályok azonban nem futnak, mielőtt a mérkőzés fázisa újraindulna. Az egyeztetési fázis miatt a szabálymotor eltávolíthatja ezeket a szabályokat az ütemezésből, mielőtt még futnának.

Példa

Az alábbi példa bemutatja, hogyan működik az egyezés, az ütközésfeloldás és a művelet háromfázisú algoritmusa:

1. szabály: Jövedelem értékelése

  • Deklaratív ábrázolás

    A kérelmező hitelminősítését csak akkor szerezheti meg, ha a kérelmező jövedelem-kölcsön aránya kisebb, mint 0,2.

  • HA – AKKOR képviselet üzleti objektumokkal

    IF Application.Income / Property.Price < 0.2
    THEN Assert new CreditRating( Application)
    

2. szabály: Hitelminősítés értékelése

  • Deklaratív ábrázolás

    Csak akkor hagyja jóvá a kérelmezőt, ha a kérelmező hitelminősítése meghaladja a 725-öt.

  • HA–AKKOR Képviselet üzleti objektumokkal:

    IF Application.SSN = CreditRating.SSN AND CreditRating.Value > 725
    THEN SendApprovalLetter(Application)
    

Az alábbi táblázat összefoglalja a tényeket:

Tény Leírás Mezők
Alkalmazás Egy olyan XML-dokumentum, amely egy lakáshitel-alkalmazást jelöl. - Bevétel: $65,000
- SSN: XXX-XX-XXXX
Tulajdonság A megvásárolni kívánt tulajdonságot képviselő XML-dokumentum. - Ár: $225,000
CreditRating A hiteligénylő hitelminősítését tartalmazó XML-dokumentum. - Érték: 0-800
- SSN: XXX-XX-XXXX

A munkamemória és a napirend frissítései

Kezdetben a szabálymotor munkamemóriája és napirendje üres. Miután az alkalmazás hozzáadja az Alkalmazás és a Tulajdonság tényeket, a szabálymotor a munka memóriáját és a napirendet az alábbi módon frissíti:

Munkamemória Napirend
- Alkalmazás
-Ingatlan
1. szabály
  • A szabálymotor hozzáadja az 1. szabályt a napirendhez, mert az Application.Income / Property.Price < 0.2 feltétel igaz értékre van kiértékelve a meccs fázisában.

  • A munkamemóriában nem létezik CreditRating tény, ezért a 2. szabály feltétele nem kerül kiértékelésre.

  • Az 1. szabály az egyetlen szabály a napirenden, így a szabály végrehajtódik, majd eltűnik a napirendről.

  • Az 1. szabály egyetlen olyan műveletet határoz meg, amely egy új tényt eredményez, amely a kérelmező CreditRating-dokumentuma, amelyet hozzáadnak a munkamemória számára.

  • Miután az 1. szabály végrehajtása befejeződik, a kontroll visszatér az egyeztetési fázisba.

    Az egyetlen új objektum, amelyhez illeszkedni kell, a CreditRating adat, így az illesztési fázis eredménye a következő.

    Munkamemória Napirend
    - Alkalmazás
    -Tulajdonság
    - Hitelminősítés
    2. szabály
  • A 2. szabály végre van hajtva, amely meghív egy függvényt, amely jóváhagyó levelet küld a kérelmezőnek.

  • A 2. szabály befejeződése után a vezérlő visszatér az egyeztetési fázisba. Azonban nincs több új tény, amely megfeleltethető, és a napirend üres, így a továbbítási láncolás leáll, és a szabálykészlet végrehajtása befejeződött.

Napirend és prioritás

Annak megértéséhez, hogy az Azure Logic Apps szabálymotorja hogyan értékeli ki a szabályokat és hajt végre műveleteket, ismernie kell a napirend és a prioritás fogalmait is.

Napirend

A szabálymotor napirendje egy ütemezés, amely sorba állítja a végrehajtási szabályokat. A napirend egy motorpéldány esetében létezik, és egyetlen szabálykészleten működik, nem szabálykészletek sorozatán. Ha egy tény a munkamemóriába kerül, és egy szabály feltételei teljesülnek, a motor napirendre helyezi a szabályt, és prioritás alapján végrehajtja a szabályt. A motor felülről lefelé hajtja végre a szabály műveleteit, majd végrehajtja a következő szabály műveleteit a napirenden.

A szabálymotor blokkként kezeli a szabály műveleteit, így az összes művelet lefut, mielőtt a motor a következő szabályra lép. A szabályblokk összes művelete a blokk többi műveletétől függetlenül fut. Az állítással kapcsolatos további információkért lásd : Szabálymotor optimalizálása vezérlőfüggvényekkel.

Az alábbi példa a napirend működését mutatja be:

1. szabály

IF
Fact1 == 1
THEN
Action1
Action2

2. szabály

IF
Fact1 > 0
THEN
Action3
Action4

Ha az 1 értékű Tény1 tény be van adva a motorba, az 1. és a 2. szabálynak is teljesülnek a feltételei. A motor tehát mindkét szabályt a napirendre helyezi a műveletek végrehajtásához.

Munkamemória Napirend
1. tény (érték=1) 1. szabály:
- Művelet1
- Művelet2

2. Szabály:
- Művelet3
- Művelet4

Prioritás

Alapértelmezés szerint minden szabály 0-ra van állítva a végrehajtás prioritásaként. Ezt a prioritást azonban minden egyes szabály esetében módosíthatja. A prioritás a 0 mindkét oldalára terjedhet, nagyobb számokkal magasabb prioritással. A motor a legmagasabb prioritástól a legalacsonyabb prioritásig hajt végre műveleteket.

Az alábbi példa bemutatja, hogy a prioritás hogyan befolyásolja a szabályok végrehajtásának sorrendjét.

1. szabály (prioritás = 0)

IF
Fact1 == 1
THEN
Discount = 10%

2. szabály (prioritás = 10)

IF
Fact1 > 0
THEN
Discount = 15%

Bár mindkét szabály feltételei teljesülnek, a 2. szabály a magasabb prioritás miatt hajtja végre először. A végső kedvezmény 10 százalék az 1. szabályhoz végrehajtott művelet eredménye miatt, az alábbi táblázatban látható módon:

Munkamemória Napirend
Tény1 (érték=1) Szabály 2:
Kedvezmény: 15%

Szabály 1:
Kedvezmény: 10%

A művelet mellékhatásai és gyorsítótár viselkedése

Ha egy művelet végrehajtása hatással van egy objektum állapotára vagy a feltételekben használt kifejezésre, a művelet "mellékhatásként" jelenik meg az adott objektumon vagy kifejezésen. Ez a kifejezés nem azt jelenti, hogy a műveletnek vannak mellékhatásai, hanem az objektumra vagy kifejezésre egy vagy több művelet is hatással lehet.

Tegyük fel például, hogy a következő szabályokkal rendelkezik:

1. szabály

IF OrderForm.ItemCount > 100
THEN OrderForm.Status = "Important"

2. szabály

IF OrderList.IsFromMember = true
THEN OrderForm.UpdateStatus("Important")

Ebben a példában az OrderForm.UpdateStatus "mellékhatással" rendelkezik az OrderForm.Status állapotra, ami azt jelenti, hogy az OrderForm.Status állapotot egy vagy több művelet befolyásolhatja.

A .NET osztálytagok SideEffects tulajdonságának alapértelmezett értéke true, ami megakadályozza, hogy a szabálymotor a mellékhatásokat okozó tagokat gyorsítótárazza. Ebben a példában a szabálymotor nem gyorsítótárazza az OrderForm.Status parancsot a munkamemória számára. Ehelyett a motor az OrderForm.Status legújabb értékét kapja minden alkalommal, amikor a motor kiértékeli az 1. szabályt. Ha a SideEffects tulajdonság értéke hamis, a szabálymotor gyorsítótárazza az értéket, amikor a motor először kiértékeli az OrderForm.Status értéket. A továbbláncolásos forgatókönyvek későbbi kiértékelése esetén azonban a motor a gyorsítótárazott értéket használja.

A Microsoft Rules Composer jelenleg nem biztosít módot a SideEffects tulajdonság értékének módosítására. A SideEffects tulajdonság értékét azonban programozott módon is beállíthatja az üzleti szabályok keretrendszerén keresztül, amely egy Microsoft. NET-kompatibilis osztálykódtár. Ezt az értéket kötésre állítja a ClassMemberBinding osztály használatával a szabályfeltételekben és műveletekben használt objektummetódusok, tulajdonságok és mezők megadásához. A ClassMemberBinding osztálynak van egy SideEffects nevű tulajdonsága, amely egy logikai értéket tartalmaz, amely jelzi, hogy a tag elérése módosítja-e az értékét.

A teljesítménnyel kapcsolatos megfontolások

Ez a szakasz azt ismerteti, hogyan működik az Azure Logic Apps szabálymotorja különböző forgatókönyvekben, valamint a konfigurációs és finomhangolási paraméterek különböző értékeivel.

Ténytípusok

A szabálymotor kevesebb időt vesz igénybe a .NET-tények eléréséhez, mint az XML-tények eléréséhez. Ha választhat a .NET-tények vagy az XML-tények használata között egy szabálykészletben, fontolja meg a .NET-tények használatát a jobb teljesítmény érdekében.

Szabály prioritása

Egy szabály prioritási beállítása a 0 mindkét oldalára terjedhet, nagyobb számokkal magasabb prioritással. A műveletek a legmagasabb prioritástól a legalacsonyabb prioritásig haladva hajtanak végre. Amikor a szabálykészlet a Assert vagy Update hívásokkal hajtja végre a forward-chaining viselkedést, a Priority tulajdonság használatával optimalizálhatja a láncolást.

Tegyük fel például, hogy a 2. szabály függőséget mutat az 1. szabály által beállított értékhez. Ha az 1. szabály magasabb prioritással rendelkezik, a 2. szabály csak az 1. szabály végrehajtása és az érték frissítése után hajtódik végre. Ezzel szemben, ha 2. szabály magasabb prioritással rendelkezik, a szabály egyszer aktiválható, majd újra aktiválható, amikor 1. szabály aktiválódik, és frissíti a feltételhez kapcsolódó tényt a 2. szabály esetében. Ez a forgatókönyv lehet, hogy helyes vagy helytelen eredményt hoz, de egyértelmű, hogy a kétszeri futtatás hatással van a teljesítményre, szemben az egyszeri futtatással.

További információ: Szabályok létrehozása a Microsoft Rules Composer használatával.

Logikai VAGY operátorok

A szabálymotor úgy van optimalizálva, hogy logikai ÉS operátorokat hajtson végre, és rekonstruálja azt a szabályt, amelyet a motor eloszlató normál formában elemez, hogy a logikai VAGY operátor csak a legfelső szinten legyen használva.

Ha több logikai vagy operátort használ a körülmények között, a növekedés további permutációkat hoz létre, amelyek kibővítik a szabálymotor elemzőhálózatát. Ennek eredményeképpen a szabálymotor hosszú időt vehet igénybe a szabály normalizálásához.

Az alábbi lista a probléma lehetséges áthidaló megoldásait tartalmazza:

  • Módosítsa a szabályt egy disjunctive normal formára, hogy az OR operátor csak a legfelső szinten legyen.

    Érdemes lehet programozási úton létrehozni a szabályt, mert lehet, hogy egy szabály létrehozása diszjunktív normál formában a Microsoft Rules Composerben bonyolult lehet.

  • Dolgozzon ki egy segédösszetevőt, amely végrehajtja az OR műveletet, és logikai értéket ad vissza, majd használja az összetevőt a szabályban.

  • Ossza fel a szabályt több szabályra, és ellenőrizze, hogy a szabályok egy korábban végrehajtott szabály által beállított jelölőt keresnek-e, vagy használjon egy objektumot, amelyet egy korábban végrehajtott szabály érvényesített, például:

    • 1. szabály: IF (a == 1 OR a == 3) THEN b = true

      Szabály 2: IF (b == true) THEN …

    • Szabály 1: IF (a == 1 OR a == 3) THEN Assert(new c())

      Szabály 2: IF (c.flag == true) THEN …

Hívások frissítése

Az Update függvény frissíti a szabálymotor munkamemóriában található tényt, ami a frissített tényt feltételek között használó összes szabály újraértékelését okozza. Ez a viselkedés azt jelenti, hogy a frissítési függvényhívások költségesek lehetnek, különösen akkor, ha számos szabály újraértékelést igényel a frissített tények miatt. Bizonyos helyzetekben elkerülheti a szabályok újraértékelését.

Vegyük például a következő szabályokat:

1. szabály

IF PurchaseOrder.Amount > 5
THEN StatusObj.Flag = true; Update(StatusObj)

2. szabály

IF PurchaseOrder.Amount <= 5
THEN StatusObj.Flag = false; Update(StatusObj)

A szabálykészlet többi szabálya a StatusObj.Flag jelölőt használja a feltételekben. Amikor meghívja a StatusObj objektum Frissítés függvényét, a rendszer az összes szabályt újraértékeli. Bármi legyen is az érték az Összeg mezőben, az 1. és a 2. szabály kivételével az összes szabály kétszer lesz kiértékelve: egyszer a frissítésihívás előtt, egyszer pedig a frissítési hívás után.

Ehelyett a szabálykészlet meghívása előtt a Jelölő értékét hamis értékre állíthatja, majd a szabálykészletben csak az 1. szabályt használhatja a jelölő beállításához. Ebben az esetben a Frissítés függvény csak akkor lesz meghívva, ha az Összeg érték nagyobb, mint 5. A Frissítés függvény nem lesz meghívva, ha az összeg kisebb vagy egyenlő 5-nél. Így az 1. és a 2. szabály kivételével az összes szabályt csak kétszer értékeli ki a rendszer, ha az Összeg érték nagyobb, mint 5.

A SideEffects tulajdonság viselkedése és a gyorsítótárazás viselkedése

Az XmlDocumentFieldBinding és ClassMemberBinding osztályokban a SideEffects tulajdonság határozza meg, hogy gyorsítótárazza-e a kötött mező, tag vagy oszlop értékét.

Az XmlDocumentFieldBinding osztályban a SideEffects tulajdonság alapértelmezett értéke hamis. A ClassMemberBinding osztályban azonban a SideEffects tulajdonság alapértelmezett értéke igaz.

Ha tehát a motor a szabálykészleten belül másodszor vagy később fér hozzá egy XML-dokumentum egyik mezőjéhez, a motor lekéri a mező értékét a gyorsítótárból. Ha azonban a motor másodszor vagy később fér hozzá egy .NET-objektum egy tagához a szabálykészleten belül, a motor nem a gyorsítótárból, hanem a .NET-objektumból szerzi be az értéket.

Ez a viselkedés azt jelenti, hogy ha a .NET ClassMemberBindingben a SideEffects tulajdonságot hamis értékre állítja, javíthatja a teljesítményt, mert a motor a második alkalommal és a következő időponttól kezdve lekéri a tag értékét a gyorsítótárból. A tulajdonságértéket azonban csak programozott módon állíthatja be, mert a Microsoft Rules Composer nem teszi elérhetővé a SideEffects tulajdonságot .

Példányok és szelektivitás

Az XmlDocumentBinding és a ClassBinding osztály mindegyike a következő tulajdonságokkal rendelkezik, amelyeket a szabálymotor az értékükkel optimalizál a feltétel kiértékeléséhez. Ezek a tulajdonságértékek lehetővé teszik, hogy a motor először a lehető legkevesebb példányt használja a feltételértékelésekben, majd használja a többi példányt.

  • Példányok: A munkamemória osztálypéldányainak várt száma.

    Ha előre ismeri az objektumpéldányok számát, a teljesítmény javítása érdekében beállíthatja a Példányok tulajdonságot erre a számra.

  • Szelektivitás: Azon osztálypéldányok százalékos aránya, amelyek sikeresen megfelelnek a szabályfeltételeknek.

    Ha ismeri a feltételeknek korábban megfelelő objektumpéldányok százalékos arányát, a teljesítmény javítása érdekében a Selectivity tulajdonságot erre a százalékra állíthatja be.

Ezeket a tulajdonságértékeket csak programozott módon állíthatja be, mert a Microsoft Rules Composer nem teszi elérhetővé őket.

Az osztályöröklés támogatása

Az öröklés az a képesség, amely egy meglévő osztály összes funkcióját képes használni, és ezeket a képességeket az eredeti osztály újraírása nélkül is kiterjesztheti, ami az Objektumorientált programozás (OOP) nyelv egyik kulcsfontosságú funkciója.

Az Azure Logic Apps szabálymotorja az alábbi osztályöröklési típusokat támogatja:

  • Implementálás öröklése: Az alaposztály tulajdonságainak és metódusainak más kódolás nélküli használatára való képesség.

  • Interfészöröklés: Csak a tulajdonságnevek és a metódusnevek használhatók, de a gyermekosztálynak biztosítania kell a megvalósítást.

A szabálymotorral szabályokat írhat egy közös alaposztályra vonatkozóan, de a szabálymotorban érvényesített objektumok származtatható osztályokból is származhatnak.

Az alábbi példában egy Employee nevű alaposztály található, míg a származtatott osztályok neve RegularEmployee és ContractEmployee.

class Employee
{
    public string Status()
    {
        // member definition
    }
    public string TimeInMonths()
    {
        // member definition
    }
}

class ContractEmployee : Employee
{
   // class definition
}
class RegularEmployee : Employee
{
   // class definition
}

Ebben a példában tegyük fel, hogy a következő szabályokkal rendelkezik:

1. szabály

IF Employee.TimeInMonths < 12
THEN Employee.Status = "New"

At run time, if you assert two objects, a **ContractEmployee** instance and a **RegularEmployee** instance, the engine evaluates both objects against the Rule 1.

You can also assert derived class objects in actions by using an **Assert** function. This function causes the engine to reevaluate rules that contain the derived object and the base type in their conditions as shown in the following example, which demonstrates implementation inheritance:

**Rule 2**

```text
IF Employee.Status = "Contract"
THEN Employee.Bonus = false
Assert(new ContractEmployee())

Az állítás után a motor újraértékel minden olyan szabályt, amely az Alkalmazott vagy a ContractEmployee típust tartalmazza a feltételek között. Annak ellenére, hogy csak a származtatott osztály van érvényesítve, az alaposztály akkor is érvényes lesz, ha a szabályok az alaposztály metódusaival vannak megírva, nem pedig a származtatott osztályban.