Změna streamů v rozhraní API služby Azure Cosmos DB pro MongoDB

PLATÍ PRO: MongoDB

Podpora kanálu změn v rozhraní API služby Azure Cosmos DB pro MongoDB je k dispozici pomocí rozhraní API pro streamy změn. Pomocí rozhraní API pro datové proudy změn můžou vaše aplikace získat změny provedené v kolekci nebo v položkách v jednom horizontálním oddílu. Později můžete na základě výsledků provést další akce. Změny položek v kolekci se zaznamenávají v pořadí podle času jejich úpravy a pořadí řazení je zaručeno pro každý klíč horizontálního oddílu.

Poznámka

Pokud chcete použít streamy změn, vytvořte účet rozhraní API služby Azure Cosmos DB pro MongoDB se serverem verze 3.6 nebo vyšší. Pokud spustíte příklady streamu změn pro starší verzi, může se zobrazit chyba Nerozpoznaný název fáze kanálu: $changeStream .

Příklady

Následující příklad ukazuje, jak získat streamy změn u všech položek v kolekci. Tento příklad vytvoří kurzor pro sledování položek při jejich vložení, aktualizaci nebo nahrazení. Fáze $match , $project fáze a fullDocument možnost se vyžadují k získání datových proudů změn. Sledování operací odstranění pomocí datových proudů změn se v současné době nepodporuje. Jako alternativní řešení můžete k odstraněným položkám přidat symbolovou značku. Do položky můžete například přidat atribut s názvem "odstraněno". Pokud chcete položku odstranit, můžete nastavit hodnotu Odstraněno na true a hodnotu TTL pro položku. Vzhledem k tomu, že aktualizace "odstraněno" na true je aktualizace, bude tato změna viditelná ve streamu změn.

var cursor = db.coll.watch(
    [
        { $match: { "operationType": { $in: ["insert", "update", "replace"] } } },
        { $project: { "_id": 1, "fullDocument": 1, "ns": 1, "documentKey": 1 } }
    ],
    { fullDocument: "updateLookup" });

while (!cursor.isExhausted()) {
    if (cursor.hasNext()) {
        printjson(cursor.next());
    }
}

Změny v rámci jednoho horizontálního oddílu

Následující příklad ukazuje, jak získat změny položek v rámci jednoho horizontálního oddílu. Tento příklad získá změny položek, které mají klíč horizontálního oddílu roven "a" a hodnota klíče horizontálního oddílu rovna "1". Je možné, že různí klienti budou číst změny z různých horizontálních oddílů paralelně.

var cursor = db.coll.watch(
    [
        { 
            $match: { 
                $and: [
                    { "fullDocument.a": 1 }, 
                    { "operationType": { $in: ["insert", "update", "replace"] } }
                ]
            }
        },
        { $project: { "_id": 1, "fullDocument": 1, "ns": 1, "documentKey": 1} }
    ],
    { fullDocument: "updateLookup" });

Škálování datových proudů změn

Při použití datových proudů změn ve velkém měřítku je nejlepší rovnoměrně rozložit zatížení. Pomocí vlastního příkazu GetChangeStreamTokens rozložte zatížení napříč fyzickými horizontálními oddíly nebo oddíly.

Aktuální omezení

Při používání datových proudů změn platí následující omezení:

  • Vlastnosti operationType a updateDescription zatím nejsou ve výstupním dokumentu podporované.
  • V insertsoučasné době se podporují typy operací , updatea replace . Operace odstranění ani jiné události se ale zatím nepodporují.

Vzhledem k těmto omezením se vyžadují možnosti $match fáze, fáze $project a fullDocument, jak je znázorněno v předchozích příkladech.

Na rozdíl od kanálu změn v rozhraní API služby Azure Cosmos DB pro NoSQL neexistuje samostatná knihovna procesoru kanálu změn , která by využívala streamy změn nebo je potřeba kontejner zapůjčení. V současné době se nepodporuje Azure Functions triggery pro zpracování datových proudů změn.

Zpracování chyb

Při použití datových proudů změn jsou podporovány následující kódy chyb a zprávy:

  • Kód chyby HTTP 16500 – Když dojde k omezení streamu změn, vrátí prázdnou stránku.

  • NamespaceNotFound (OperationType Invalidate) – Pokud spustíte stream změn pro kolekci, která neexistuje, nebo pokud je kolekce vyřazena, NamespaceNotFound vrátí se chyba. Vzhledem k tomu, operationType že vlastnost se ve výstupním dokumentu nedá vrátit, místo operationType Invalidate chyby NamespaceNotFound se vrátí chyba.

Další kroky