Tárolt eljárások, eseményindítók és felhasználó által definiált függvények

A KÖVETKEZŐRE VONATKOZIK: NoSQL

Az Azure Cosmos DB a JavaScript nyelvintegrált, tranzakciós végrehajtását nyújtja. Ha a NoSQL API-t az Azure Cosmos DB-ben használja, javaScript nyelven írhat tárolt eljárásokat, eseményindítókat és felhasználó által definiált függvényeket (UDF-eket). JavaScript nyelven írhatja meg az adatbázismotorban végrehajtott logikát. Eseményindítókat, tárolt eljárásokat és UDF-eket hozhat létre és hajthat végre a Azure Portal, a JavaScript nyelvvel integrált lekérdezési API-val az Azure Cosmos DB-ben vagy az Azure Cosmos DB for NoSQL ügyféloldali SDK-kkal.

A kiszolgálóoldali programozás használatának előnyei

A tárolt eljárások, eseményindítók és felhasználó által definiált függvények (UDF-ek) JavaScriptben való írásával gazdag alkalmazásokat hozhat létre, és az alábbi előnyökkel jár:

  • Eljárási logika: A JavaScript egy magas szintű programozási nyelv, amely gazdag és ismerős felületet biztosít az üzleti logika kifejezéséhez. Összetett műveletek sorozatát hajthatja végre az adatokon.

  • Atomi tranzakciók: Az egyetlen tárolt eljáráson vagy eseményindítón belül végrehajtott Azure Cosmos DB-adatbázisműveletek atomiak. Ez az atomi funkció lehetővé teszi, hogy az alkalmazások egyetlen kötegbe egyesíthessék a kapcsolódó műveleteket, hogy az összes művelet sikeres legyen, vagy egyik sem sikeres.

  • Teljesítmény: A JSON-adatok belsőleg a JavaScript nyelvtípus-rendszerre vannak leképezve. Ez a leképezés számos optimalizálást tesz lehetővé, például a JSON-dokumentumok lusta materializálását a pufferkészletben, és igény szerint elérhetővé teszi őket a végrehajtó kód számára. Az üzleti logika adatbázisba való áthelyezésének egyéb teljesítménybeli előnyei is vannak, amelyek a következőket foglalják magukban:

    • Adagoló: Csoportosíthatja a műveleteket, például a beszúrásokat, és tömegesen elküldheti őket. A hálózati forgalom késési költségei és a különálló tranzakciók létrehozásához kapcsolódó tárterhelés jelentősen csökken.

    • Fordítás előtti: A tárolt eljárásokat, eseményindítókat és UDF-eket implicit módon előre lefordítja a bájtkód formátumára, hogy elkerülje a fordítási költségeket az egyes szkripthívások idején. Az előfordítás miatt a tárolt eljárások meghívása gyors, és alacsony a lábnyoma.

    • Szekvencia: Előfordulhat, hogy a műveleteknek olyan eseményindító mechanizmusra van szükségük, amely végrehajthat egy vagy több frissítést az adatokon. Az Atomicity mellett a kiszolgálóoldali végrehajtásnak is vannak teljesítménybeli előnyei.

  • Beágyazás: A tárolt eljárások a logika egy helyen történő csoportosítására használhatók. Az encapsulation egy absztrakciós réteget ad hozzá az adatokhoz, így az adatoktól függetlenül fejlesztheti az alkalmazásokat. Ez az absztrakciós réteg akkor hasznos, ha az adatok séma nélküliek, és nem kell további logikát közvetlenül hozzáadnia az alkalmazáshoz. Az absztrakció lehetővé teszi az adatok biztonságának megőrzését a szkriptek hozzáférésének streamelésével.

Tipp

A tárolt eljárások leginkább olyan műveletekhez ideálisak, amelyek írási nehézkesek, és tranzakciót igényelnek egy partíciókulcs-érték között. Amikor eldönti, hogy használ-e tárolt eljárásokat, optimalizálja a lehető legnagyobb írási mennyiség beágyazását. Általánosságban elmondható, hogy a tárolt eljárások nem a leghatékonyabb eszközök nagy számú olvasási vagy lekérdezési művelet végrehajtására, így a tárolt eljárások nagy mennyiségű olvasás kötegelésére az ügyfélhez való visszatéréshez nem járnak a kívánt előnyökkel. A legjobb teljesítmény érdekében ezeket az olvasási nehéz műveleteket az ügyféloldalon kell elvégezni az Azure Cosmos DB SDK használatával.

Megjegyzés

A kiszolgálóoldali JavaScript-funkciók, beleértve a tárolt eljárásokat, az eseményindítókat és a felhasználó által definiált függvényeket, nem támogatják a modulok importálását.

Tranzakciók

A tipikus adatbázisok tranzakciói a műveletek egyetlen logikai egységként végrehajtott sorozataként definiálhatók. Minden tranzakció ACID-tulajdonsággaranciát biztosít. Az ACID egy jól ismert betűszó, amely a következőt jelenti: Atomicity, Consistency, Isolation és Durability.

  • Az atomiság garantálja, hogy a tranzakción belül végrehajtott összes művelet egyetlen egységként lesz kezelve, és vagy mindegyik véglegesítve van, vagy egyik sem.

  • A konzisztencia biztosítja, hogy az adatok mindig érvényes állapotban legyenek a tranzakciók között.

  • Az elkülönítés garantálja, hogy egyetlen két tranzakció sem zavarja egymást – számos kereskedelmi rendszer több elkülönítési szintet biztosít, amelyek az alkalmazás igényeinek megfelelően használhatók.

  • A tartósság biztosítja, hogy az adatbázisban véglegesített módosítások mindig jelen legyenek.

Az Azure Cosmos DB-ben a JavaScript-futtatókörnyezet az adatbázismotoron belül található. Ezért a tárolt eljárásokban és az eseményindítókban végrehajtott kérések ugyanabban a hatókörben futnak, mint az adatbázis-munkamenet. Ez a funkció lehetővé teszi, hogy az Azure Cosmos DB garantálja az ACID-tulajdonságokat minden olyan művelethez, amely egy tárolt eljárás vagy eseményindító részét képezi. Példákért tekintse meg a tranzakciók implementálásáról szóló cikket.

Tipp

Az Azure Cosmos DB for NoSQL tranzakciós támogatásához tranzakciós kötegeket is implementálhat az előnyben részesített ügyféloldali SDK használatával. További információ: Tranzakciós kötegműveletek az Azure Cosmos DB for NoSQL-ben.

Tranzakció hatóköre

A tárolt eljárások egy Azure Cosmos DB-tárolóhoz vannak társítva, és a tárolt eljárások végrehajtása egy logikai partíciókulcsra terjed ki. A tárolt eljárásoknak tartalmazniuk kell egy logikai partíciókulcs-értéket a végrehajtás során, amely meghatározza a tranzakció hatóköréhez tartozó logikai partíciót. További információ: Azure Cosmos DB particionálási cikk.

Véglegesítés és visszaállítás

A tranzakciók natív módon integrálva vannak az Azure Cosmos DB JavaScript programozási modellbe. Egy JavaScript-függvényen belül az összes művelet automatikusan egyetlen tranzakcióba van burkolva. Ha a tárolt eljárás JavaScript-logikája kivétel nélkül befejeződik, a tranzakción belüli összes művelet le lesz véglegesítve az adatbázisra. A relációs adatbázisokhoz hasonló BEGIN TRANSACTION és COMMIT TRANSACTION (a relációs adatbázisokhoz ismerős) utasítások implicitek az Azure Cosmos DB-ben. Ha vannak kivételek a szkriptből, az Azure Cosmos DB JavaScript-futtatókörnyezet visszaállítja a teljes tranzakciót. Így a kivétel kivetése gyakorlatilag egyenértékű az Azure Cosmos DB-ben lévő kivételekkel ROLLBACK TRANSACTION .

Adatkonzisztencia

A tárolt eljárásokat és eseményindítókat a rendszer mindig egy Azure Cosmos DB-tároló elsődleges replikáján hajtja végre. Ez a funkció biztosítja, hogy a tárolt eljárásokból származó olvasások erős konzisztenciát biztosítsanak. A felhasználó által definiált függvényeket használó lekérdezések az elsődleges vagy bármely másodlagos replikán végrehajthatók. A tárolt eljárások és eseményindítók a tranzakciós írások támogatására szolgálnak – eközben az írásvédett logika a legjobban alkalmazásoldali logikaként van implementálva, és az Azure Cosmos DB for NoSQL SDK-k használatával végzett lekérdezések segítenek az adatbázis átviteli sebességének telítődésében.

Tipp

Előfordulhat, hogy a tárolt eljárásban vagy eseményindítóban végrehajtott lekérdezések nem látják az ugyanazon szkripttranzakció által végrehajtott elemek módosításait. Ez az utasítás az SQL-lekérdezésekre, például getContent().getCollection.queryDocuments()a , valamint az olyan integrált nyelvi lekérdezésekre is vonatkozik, mint getContext().getCollection().filter()például a .

Kötött végrehajtás

Minden Azure Cosmos DB-műveletnek a megadott időtúllépési időtartamon belül kell befejeződnie. A tárolt eljárások időkorlátja 5 másodperc. Ez a korlátozás a JavaScript-függvényekre vonatkozik – tárolt eljárásokra, eseményindítókra és felhasználó által definiált függvényekre. Ha egy művelet nem fejeződik be ezen az időkorláton belül, a rendszer visszaállítja a tranzakciót.

Meggyőződhet arról, hogy a JavaScript-függvények az időkorláton belül befejeződnek, vagy folytatásalapú modellt implementálhat a kötegelt/folytatási végrehajtáshoz. A tárolt eljárások és eseményindítók időkorlátok kezelésére történő fejlesztésének egyszerűsítése érdekében az Azure Cosmos DB-tárolóban található összes függvény (például elemek létrehozása, olvasása, frissítése és törlése) egy logikai értéket ad vissza, amely azt jelzi, hogy a művelet befejeződik-e. Ha ez az érték hamis, az azt jelzi, hogy az eljárásnak be kell fejeznie a végrehajtást, mert a szkript több időt vagy kiosztott átviteli sebességet használ, mint a konfigurált érték. Az első nem észlelt tárolási művelet előtt várólistára helyezett műveletek garantáltan befejeződnek, ha a tárolt eljárás időben befejeződik, és nem küldi el a további kéréseket. Így a műveleteket egyenként kell sorba állítani a JavaScript visszahívási konvenciójával a szkript vezérlési folyamatának kezeléséhez. Mivel a szkriptek kiszolgálóoldali környezetben vannak végrehajtva, szigorúan szabályozottak. Előfordulhat, hogy a végrehajtási határokat ismételten megsértő szkriptek inaktívként vannak megjelölve, és nem hajthatók végre, és újra létre kell hozni őket a végrehajtási határok betartásához.

A JavaScript-függvények kiépített átviteli kapacitásra is vonatkoznak. A JavaScript-függvények rövid időn belül nagy számú kérelemegységet használhatnak, és a kiosztott átviteli sebesség kapacitáskorlátjának elérése esetén a sebesség korlátozott lehet. Fontos megjegyezni, hogy a szkriptek az adatbázis-műveletek végrehajtásával töltött átviteli sebesség mellett további átviteli sebességet is felhasználnak, bár ezek az adatbázis-műveletek valamivel olcsóbbak, mint az ügyféltől végrehajtott műveletek.

Triggerek

Az Azure Cosmos DB az eseményindítók két típusát támogatja:

Előzetes eseményindítók

Az Azure Cosmos DB olyan eseményindítókat biztosít, amelyek egy Azure Cosmos DB-elemen végzett művelet végrehajtásával hívhatók meg. Meghatározhat például egy előzetes eseményindítót, amikor elemet hoz létre. Ebben az esetben az előzetes eseményindító az elem létrehozása előtt fut. Az előzetes eseményindítóknak nem lehetnek bemeneti paramétereik. Szükség esetén a kérésobjektummal frissíthető a dokumentum törzse az eredeti kéréshez képest. Az eseményindítók regisztrálásakor a felhasználók meghatározhatják azokat a műveleteket, amelyekkel futhatnak. Ha egy eseményindító a TriggerOperation.Create művelettel lett létrehozva, az azt jelenti, hogy az eseményindító nem használható csere műveletben. Példaként tekintse meg az Eseményindítók írása című cikket.

Utólagos eseményindítók

Az előindítókhoz hasonlóan az eseményindítók utáni műveletek is egy Azure Cosmos DB-elemen futó művelethez vannak társítva, és nem igényelnek bemeneti paramétereket. A művelet befejezése után futnak, és hozzáférnek az ügyfélnek küldött válaszüzenethez. Példaként tekintse meg az Eseményindítók írása című cikket.

Megjegyzés

A regisztrált eseményindítók nem futnak automatikusan, ha a megfelelő műveletek (létrehozás/ törlés / csere / frissítés) történnek. Explicit módon kell meghívni őket a műveletek végrehajtásakor. További információért tekintse meg az eseményindítók futtatásáról szóló cikket.

Felhasználó által definiált függvények

A felhasználó által definiált függvények (UDF-ek) a NoSQL API lekérdezési nyelvszintaxisának kiterjesztésére és az egyéni üzleti logika egyszerű implementálására szolgálnak. Csak lekérdezésekben hívhatók meg. Az UDF-ek nem férnek hozzá a környezeti objektumhoz, és csak számítási célokat szolgálnak JavaScriptként. Ezért az UDF-ek futtathatók másodlagos replikákon.

JavaScript nyelvvel integrált lekérdezési API

A NoSQL-hez készült API lekérdezési szintaxisát használó lekérdezések mellett a kiszolgálóoldali SDK lehetővé teszi a lekérdezések végrehajtását Egy JavaScript-felület használatával, az SQL ismerete nélkül. A JavaScript lekérdezési API lehetővé teszi a lekérdezések programozott összeállítását úgy, hogy predikátumfüggvényeket ad át függvényhívások sorozatába. A lekérdezéseket a JavaScript-futtatókörnyezet elemzi, és hatékonyan hajtja végre őket az Azure Cosmos DB-ben. A JavaScript lekérdezési API támogatásával kapcsolatos további információkért lásd: A JavaScript nyelvvel integrált lekérdezési API használata című cikk. Példákért lásd: Tárolt eljárások és eseményindítók írása JavaScript Query API használatával .

Következő lépések

A következő cikkekkel megtudhatja, hogyan írhat és használhat tárolt eljárásokat, eseményindítókat és felhasználó által definiált függvényeket az Azure Cosmos DB-ben:

Kapacitástervezést szeretne végezni az Azure Cosmos DB-be való migráláshoz? A kapacitástervezéshez használhatja a meglévő adatbázisfürtre vonatkozó információkat.