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


Ajánlott eljárások az Azure Cosmos DB .NET SDK-hoz

A KÖVETKEZŐRE VONATKOZIK: NoSQL

Ez a cikk az Azure Cosmos DB .NET SDK használatának ajánlott eljárásait ismerteti. Ezen eljárások követésének segítségével javíthatja a késést, a rendelkezésre állást és növelheti az általános teljesítményt.

Az alábbi videóból többet is megtudhat az Azure Cosmos DB-mérnök .NET SDK-jának használatáról!

Ellenőrzőlista

Jelölje be Tárgy Részletek/hivatkozások
SDK verziója Mindig az optimális teljesítmény érdekében elérhető Azure Cosmos DB SDK legújabb verzióját használja.
Singleton-ügyfél Használjon egyetlen példányt CosmosClient az alkalmazás teljes élettartama alatt a jobb teljesítmény érdekében.
Régiók A késés csökkentése érdekében mindenképpen ugyanabban az Azure-régióban futtassa az alkalmazást, mint az Azure Cosmos DB-fiókját. Engedélyezze a 2–4 régiót, és replikálja a fiókjait több régióban a legjobb rendelkezésre állás érdekében. Éles számítási feladatok esetén engedélyezze a szolgáltatás által felügyelt feladatátvételt. Ennek a konfigurációnak a hiányában a fiók írási rendelkezésre állása az írási régió leállásának teljes időtartamára csökken, mivel a manuális feladatátvétel a régiókapcsolat hiánya miatt nem fog sikerülni. Ha többet szeretne megtudni arról, hogyan vehet fel több régiót a .NET SDK használatával, látogasson el ide
Rendelkezésre állás és feladatátvétel Állítsa be az ApplicationPreferredRegions vagy ApplicationRegion értéket a v3 SDK-ban, a Preferált helyeket pedig a v2 SDK-ban az előnyben részesített régiók listájával. A feladatátvételek során az írási műveleteket a rendszer az aktuális írási régióba küldi, és az összes olvasást az előnyben részesített régiók listájában lévő első régióba küldi. A regionális feladatátvételi mechanikával kapcsolatos további információkért tekintse meg a rendelkezésre állási hibaelhárítási útmutatót.
CPU Kapcsolódási/rendelkezésre állási problémákat tapasztalhat az ügyfélszámítógép erőforrásainak hiánya miatt. Monitorozza a cpu-kihasználtságot az Azure Cosmos DB-ügyfelet futtató csomópontokon, és vertikálisan fel- és felskálázható, ha a használat magas.
Üzemeltetés Amikor csak lehetséges, használja a Windows 64 bites gazdagépfeldolgozást a legjobb teljesítmény érdekében. A közvetlen módú késésre érzékeny éles számítási feladatok esetében mindenképpen javasoljuk legalább 4 magos és 8 GB-os memória virtuális gépek használatát, amikor csak lehetséges.
Kapcsolati módok A legjobb teljesítmény érdekében használja a Közvetlen módot . Ennek módjáról a V3 SDK dokumentációjában vagy a V2 SDK dokumentációjában olvashat.
Hálózat Ha virtuális gépet használ az alkalmazás futtatásához, engedélyezze a gyorsított hálózatkezelést a virtuális gépen, hogy segítsen a nagy forgalom miatti szűk keresztmetszetek elhárításában, és csökkentse a késést vagy a cpu-jittert. Érdemes lehet megfontolni egy magasabb szintű virtuális gép használatát is, ahol a maximális processzorhasználat 70% alatt van.
Rövid élettartamú portkimerülés A ritka vagy szórványos kapcsolatok esetében a IdleConnectionTimeout PortReuseMode PrivatePortPoolkövetkezőt állítjuk be: . A IdleConnectionTimeout tulajdonság segít szabályozni a nem használt kapcsolatok bezárásának időpontját. Ez csökkenti a nem használt kapcsolatok számát. Alapértelmezés szerint a tétlen kapcsolatok határozatlan ideig nyitva maradnak. Az értékhalmaznak 10 percnél nagyobbnak vagy egyenlőnek kell lennie. 20 perc és 24 óra közötti értékeket ajánlottunk. A PortReuseMode tulajdonság lehetővé teszi az SDK számára, hogy rövid élettartamú portokból álló kis készletet használjon a különböző Azure Cosmos DB-célvégpontokhoz.
Az Async/Await használata Kerülje a hívások blokkolását: Task.Result, Task.Waités Task.GetAwaiter().GetResult(). A teljes hívásverem aszinkron, hogy kihasználhassa az aszinkron/várakozási mintákat. Számos szinkron blokkoló hívás a szálkészlet éhezéséhez és a válaszidő romlásához vezet.
Végpontok közötti időtúllépések A végpontok közötti időtúllépésekhez mindkettőt RequestTimeout és CancellationToken paramétereket kell használnia. További részletekért tekintse meg az időtúllépési hibaelhárítási útmutatót.
Újrapróbálkozási logika Az SDK-k által újrapróbálkozandó és újrapróbálkozott hibákról további információt a tervezési útmutatóban talál. A több régióval konfigurált fiókok esetében vannak olyan esetek , amikor az SDK automatikusan újrapróbálkozott más régiókon. A .NET-specifikus megvalósítási részletekért látogasson el az SDK forrásadattárába.
Adatbázis-/gyűjteménynevek gyorsítótárazása Kérje le az adatbázisok és tárolók nevét a konfigurációból, vagy gyorsítótárazza őket az indításkor. A hívások a szolgáltatás metaadat-hívásait kedvelik ReadDatabaseAsync vagy ReadDocumentCollectionAsync CreateDatabaseQuery CreateDocumentCollectionQuery fogják eredményezni, amelyek a rendszer által fenntartott RU-korlátból származnak. CreateIfNotExist az adatbázis beállításához is csak egyszer kell használni. Általánosságban elmondható, hogy ezeket a műveleteket ritkán kell végrehajtani.
Tömeges támogatás Olyan esetekben, amikor nem szükséges optimalizálnia a késésre, javasoljuk, hogy engedélyezze a tömeges támogatást a nagy mennyiségű adat memóriaképéhez.
Párhuzamos lekérdezések Az Azure Cosmos DB SDK támogatja a lekérdezések párhuzamos futtatását a lekérdezések jobb késése és átviteli sebessége érdekében. Javasoljuk, hogy a MaxConcurrency tulajdonságot a QueryRequestsOptions megadott számú partícióra állítsa. Ha nem ismeri a partíciók számát, kezdje a használatával int.MaxValue, amely a legjobb késést nyújtja. Ezután csökkentse a számot, amíg meg nem felel a környezet erőforrás-korlátozásainak a magas CPU-problémák elkerülése érdekében. Emellett állítsa be a MaxBufferedItemCount visszaadott eredmények várt számát is az előre megadott eredmények számának korlátozásához.
Teljesítménytesztelési visszalépések Az alkalmazáson végzett tesztelés során időközönként végre kell hajtania a visszalépéseket RetryAfter . A visszalépés tiszteletben tartásával biztosíthatja, hogy az újrapróbálkozások között minimális ideig várakozhasson.
Indexelés Az Azure Cosmos DB indexelési szabályzata azt is lehetővé teszi, hogy az indexelési útvonalak (IndexingPolicy.IncludePaths és IndexingPolicy.ExcludedPaths) használatával megszűrje, hogy mely dokumentum elérési útjait vegye fel vagy zárja ki az indexelésből. A gyorsabb írás érdekében zárja ki a nem használt útvonalakat az indexelésből. Az indexek SDK-val történő létrehozásáról további információt a .NET SDK v3 teljesítménytippjeiben talál.
Dokumentumméret Egy adott művelet kérelemdíja közvetlenül a dokumentum méretével függ össze. Javasoljuk, hogy csökkentse a dokumentumok méretét, mivel a nagyméretű dokumentumokon végzett műveletek többe kerülnek, mint a kisebb dokumentumokon végzett műveletek.
Szálak/tevékenységek számának növelése Mivel az Azure Cosmos DB-be irányuló hívások a hálózaton keresztül történik, előfordulhat, hogy a kérések egyidejűségének mértékét módosítania kell, hogy az ügyfélalkalmazás minimális időt töltsön a kérések közötti várakozással. Ha például a .NET-feladat párhuzamos kódtárát használja, több száz olyan feladat sorrendjében hozzon létre, amelyek az Azure Cosmos DB-ből olvasnak vagy írnak.
Lekérdezési metrikák engedélyezése A háttérbeli lekérdezések végrehajtásának további naplózásához engedélyezheti az SQL-lekérdezési metrikákat a .NET SDK használatával. Az SQL-lekérdezési metrikák gyűjtésével kapcsolatos további információkért tekintse meg a lekérdezési metrikákat és a teljesítményt.
SDK-naplózás Naplózza az SDK-diagnosztikát a fennálló forgatókönyvek, például a kivételek vagy a kérések várt késésen túli diagnosztikáihoz.
DefaultTraceListener A DefaultTraceListener teljesítményproblémákat okoz az éles környezetekben, ami magas processzor- és I/O-szűk keresztmetszeteket okoz. Győződjön meg arról, hogy a legújabb SDK-verziókat használja, vagy távolítsa el a DefaultTraceListenert az alkalmazásból
Ne használjon speciális karaktereket az azonosítókban Egyes karakterek korlátozottak, és egyes azonosítókban nem használhatók: '/', '\', '?', '#'. Az általános javaslat az, hogy a váratlan viselkedés elkerülése érdekében ne használjon speciális karaktereket az azonosítókban, például az adatbázis neve, a gyűjtemény neve, az elemazonosító vagy a partíciókulcs.

A diagnosztikai adatok rögzítése

Az SDK összes válasza, beleértve a tulajdonságot isCosmosException, rendelkezik.Diagnostics Ez a tulajdonság az egyetlen kéréssel kapcsolatos összes információt rögzíti, beleértve az újrapróbálkozások vagy átmeneti hibák esetén is.

A rendszer sztringként adja vissza a diagnosztikát. A sztring az egyes verziókkal együtt változik, mivel a különböző forgatókönyvek hibaelhárítása is javult. Az SDK minden egyes verziójában a sztring formázásának kompatibilitástörő változásai lesznek. Ne elemezd a sztringet a kompatibilitástörő módosítások elkerülése érdekében. Az alábbi kódminta bemutatja, hogyan olvashatók be a diagnosztikai naplók a .NET SDK használatával:

try
{
    ItemResponse<Book> response = await this.Container.CreateItemAsync<Book>(item: testItem);
    if (response.Diagnostics.GetClientElapsedTime() > ConfigurableSlowRequestTimeSpan)
    {
        // Log the response.Diagnostics.ToString() and add any additional info necessary to correlate to other logs 
    }
}
catch (CosmosException cosmosException)
{
    // Log the full exception including the stack trace with: cosmosException.ToString()
    
    // The Diagnostics can be logged separately if required with: cosmosException.Diagnostics.ToString()
}

// When using Stream APIs
ResponseMessage response = await this.Container.CreateItemStreamAsync(partitionKey, stream);
if (response.Diagnostics.GetClientElapsedTime() > ConfigurableSlowRequestTimeSpan || !response.IsSuccessStatusCode)
{
    // Log the diagnostics and add any additional info necessary to correlate to other logs with: response.Diagnostics.ToString()
}

Ajánlott eljárások HTTP-kapcsolatokhoz

A .NET SDK a konfigurált kapcsolati módtól függetlenül HTTP-kéréseket hajt HttpClient végre. A közvetlen módban a HTTP metaadat-műveletekhez, átjáró módban pedig adatsík- és metaadat-műveletekhez is használható. A HttpClient egyik alapja, hogy a HttpClient rendszer a készletezett kapcsolat élettartamának testreszabásával képes legyen reagálni a dns-változásokra a fiókjában. Amíg a készletezett kapcsolatok nyitva maradnak, nem reagálnak a DNS-változásokra. Ez a beállítás kényszeríti a készletezett kapcsolatok rendszeres bezárását , biztosítva, hogy az alkalmazás reagáljon a DNS-változásokra. Azt javasoljuk, hogy ezt az értéket a kapcsolati módnak és a számítási feladatnak megfelelően szabja testre, hogy egyensúlyba hozza az új kapcsolatok gyakori létrehozásának teljesítményhatását, és reagálnia kell a DNS-változásokra (rendelkezésre állás). Az 5 perces érték jó kezdés lenne, amely növelhető, ha ez hatással van a teljesítményre, különösen átjáró mód esetén.

Beszúrhatja az egyéni HttpClient-et CosmosClientOptions.HttpClientFactory, például:

// Use a Singleton instance of the SocketsHttpHandler, which you can share across any HttpClient in your application
SocketsHttpHandler socketsHttpHandler = new SocketsHttpHandler();
// Customize this value based on desired DNS refresh timer
socketsHttpHandler.PooledConnectionLifetime = TimeSpan.FromMinutes(5);

CosmosClientOptions cosmosClientOptions = new CosmosClientOptions()
{
    // Pass your customized SocketHttpHandler to be used by the CosmosClient
    // Make sure `disposeHandler` is `false`
    HttpClientFactory = () => new HttpClient(socketsHttpHandler, disposeHandler: false)
};

// Use a Singleton instance of the CosmosClient
return new CosmosClient("<connection-string>", cosmosClientOptions);

Ha .NET-függőséginjektálást használ, egyszerűsítheti a Singleton-folyamatot:

SocketsHttpHandler socketsHttpHandler = new SocketsHttpHandler();
// Customize this value based on desired DNS refresh timer
socketsHttpHandler.PooledConnectionLifetime = TimeSpan.FromMinutes(5);
// Registering the Singleton SocketsHttpHandler lets you reuse it across any HttpClient in your application
services.AddSingleton<SocketsHttpHandler>(socketsHttpHandler);

// Use a Singleton instance of the CosmosClient
services.AddSingleton<CosmosClient>(serviceProvider =>
{
    SocketsHttpHandler socketsHttpHandler = serviceProvider.GetRequiredService<SocketsHttpHandler>();
    CosmosClientOptions cosmosClientOptions = new CosmosClientOptions()
    {
        HttpClientFactory = () => new HttpClient(socketsHttpHandler, disposeHandler: false)
    };

    return new CosmosClient("<connection-string>", cosmosClientOptions);
});

Ajánlott eljárások átjáró mód használatakor

Növelje System.Net MaxConnections gazdagépenként az Átjáró mód használatakor. Az Azure Cosmos DB-kérések HTTPS/REST protokollon keresztül lesznek intézve, amikor átjáró módot használ. Gazdanév vagy IP-cím szerint az alapértelmezett kapcsolati korlát vonatkozik rájuk. Előfordulhat, hogy magasabb értéket kell beállítania MaxConnections (100 és 1000 között), hogy az ügyfélkódtár több egyidejű kapcsolatot használjon az Azure Cosmos DB-hez. A .NET SDK 1.8.0-s és újabb verzióiban az alapértelmezett érték ServicePointManager.DefaultConnectionLimit 50. Az érték módosításához magasabb értéket állíthat be CosmosClientOptions.GatewayModeMaxConnectionLimit .

Ajánlott eljárások írási feladatokhoz

A nagy mennyiségű hasznos adatokkal rendelkező számítási feladatok esetén állítsa a kérési beállítást a EnableContentResponseOnWrite következőre false: . A szolgáltatás többé nem adja vissza a létrehozott vagy frissített erőforrást az SDK-nak. Általában, mivel az alkalmazás rendelkezik a létrehozott objektummal, nem kell a szolgáltatásnak visszaadnia. A fejlécértékek továbbra is elérhetők, például egy kérelemdíj. A tartalomválasz letiltása javíthatja a teljesítményt, mivel az SDK-nak már nincs szüksége memória lefoglalására vagy a válasz törzsének szerializálására. Emellett csökkenti a hálózati sávszélesség használatát, hogy tovább segítse a teljesítményt.

Fontos

A beállítás EnableContentResponseOnWrite az false eseményindító művelet válaszát is letiltja.

Ajánlott eljárások több-bérlős alkalmazásokhoz

Az olyan alkalmazásoknak, amelyek több bérlő között osztják el a használatot, ahol az egyes bérlőket egy másik adatbázis, tároló vagy partíciókulcs jelöli ugyanazon az Azure Cosmos DB-fiókon belül, egyetlen ügyfélpéldányt kell használniuk. Egyetlen ügyfélpéldány használhatja egy fiók összes adatbázisát, tárolóját és partíciókulcsát, és ajánlott az egyszeri minta használata.

Ha azonban minden bérlőt egy másik Azure Cosmos DB-fiók képvisel, fiókonként külön ügyfélpéldányt kell létrehoznia. Az egyszeri minta továbbra is minden ügyfélre érvényes (az alkalmazás teljes élettartama alatt minden fiókhoz egy ügyfél), de ha a bérlők mennyisége magas, az ügyfelek száma nehezen kezelhető. A kapcsolatok a számítási környezet korlátain túl is növekedhetnek, és csatlakozási problémákat okozhatnak.

Ezekben az esetekben a következőket javasoljuk:

  • A számítási környezet (CPU- és kapcsolati erőforrások) korlátainak megismerése. Javasoljuk, hogy ha lehetséges, legalább 4 magos és 8 GB memóriával rendelkező virtuális gépeket használjunk.
  • A számítási környezet korlátozásai alapján határozza meg, hogy hány ügyfélpéldányt (és ezáltal bérlők számát) képes kezelni egy számítási példány. A kiválasztott kapcsolati módtól függően megbecsülheti az ügyfélenként megnyíló kapcsolatok számát.
  • Bérlői eloszlás kiértékelése a példányok között. Ha az egyes számítási példányok képesek bizonyos korlátozott számú bérlőt kezelni, a bérlők terheléselosztása és a bérlők különböző számítási példányokhoz való átirányítása lehetővé teszi a skálázást a bérlők számának növekedésével.
  • Ritkán használt számítási feladatok esetén érdemes lehet a legkevésbé gyakran használt gyorsítótárat használni az ügyfélpéldányok tárolására és az ügyfelek elidegenítésére olyan bérlők számára, amelyekhez egy időablakon belül nem fértek hozzá. A .NET-ben az egyik lehetőség a MemoryCacheEntryOptions, ahol a RegisterPostEvictionCallback az inaktív ügyfelek törlésére használható, a SetSlidingExpiration pedig az inaktív kapcsolatok maximális tárolásának időtartamának meghatározására használható.
  • A hálózati kapcsolatok számának csökkentése az Átjáró mód használatával kiértékelhető.
  • Közvetlen mód használatakor fontolja meg a CosmosClientOptions.IdleTcpConnectionTimeout és a CosmosClientOptions.PortReuseMode közvetlen módú konfigurációjának módosítását a nem használt kapcsolatok bezárásához és a kapcsolatok mennyiségének szabályozásához.

Következő lépések

Az Azure Cosmos DB néhány ügyfélgépen történő nagy teljesítményű forgatókönyvek kiértékeléséhez használt mintaalkalmazásért tekintse meg az Azure Cosmos DB teljesítmény- és méretezési tesztelését.

Ha többet szeretne megtudni az alkalmazás méretezéshez és nagy teljesítményhez való tervezéséről, tekintse meg a particionálást és a skálázást 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ürt adatait.