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


Az Azure Cosmos DB konzisztenciaszintjeinek kezelése

A KÖVETKEZŐRE VONATKOZIK: NoSQL

Ez a cikk bemutatja, hogyan kezelheti a konzisztenciaszinteket az Azure Cosmos DB-ben. Megtudhatja, hogyan konfigurálhatja az alapértelmezett konzisztenciaszintet, felülbírálhatja az alapértelmezett konzisztenciát, manuálisan kezelheti a munkamenet-jogkivonatokat, és megismerheti a valószínűség szerint korlátozott elavultság (PBS) metrikát.

A fiókszintű konzisztencia módosításakor győződjön meg arról, hogy újra üzembe helyezi az alkalmazásokat, és elvégez minden szükséges kódmódosítást a módosítások alkalmazásához.

Feljegyzés

Javasoljuk, hogy az Azure Az PowerShell modult használja az Azure-ral való interakcióhoz. Első lépésként tekintse meg az Azure PowerShell telepítését ismertető témakört. Az Az PowerShell-modulra történő migrálás részleteiről lásd: Az Azure PowerShell migrálása az AzureRM modulból az Az modulba.

Az alapértelmezett konzisztenciaszint beállítása

Az alapértelmezett konzisztenciaszint az ügyfelek által alapértelmezés szerint használt konzisztenciaszint.

Az alapértelmezett konzisztenciaszint megtekintéséhez vagy módosításához jelentkezzen be az Azure Portalra. Keresse meg az Azure Cosmos DB-fiókját, és nyissa meg az Alapértelmezett konzisztencia panelt . Válassza ki az új alapértelmezett konzisztenciaszintet, majd válassza a Mentés lehetőséget. Az Azure Portal a különböző konzisztenciaszintek és a zenejegyzetek megjelenítését is biztosítja.

Konzisztencia menü az Azure Portalon

Az alapértelmezett konzisztenciaszint felülírása

Az ügyfelek felülírhatják a szolgáltatás által beállított alapértelmezett konzisztenciaszintet. A konzisztenciaszint kérésenként állítható be, amely felülbírálja a fiók szintjén beállított alapértelmezett konzisztenciaszintet.

Tipp.

A konzisztencia csak az SDK-példány vagy a kérés szintjén oldható meg . Ha a gyengébbről az erősebb konzisztencia felé szeretne váltani, frissítse az Azure Cosmos DB-fiók alapértelmezett konzisztenciáját.

Tipp.

Az alapértelmezett konzisztenciaszint felülírása csak az SDK-ügyfélen belüli olvasásokra vonatkozik. Az erős konzisztenciára konfigurált fiókok alapértelmezés szerint továbbra is szinkron módon írnak és replikálnak adatokat a fiók minden régiójába. Ha az SDK-ügyfélpéldány vagy -kérés felülbírálja ezt a munkamenettel vagy gyengébb konzisztenciával, az olvasások egyetlen replikával lesznek végrehajtva. További részletekért tekintse meg a konzisztenciaszinteket és az átviteli sebességet .

.NET SDK

// Override consistency at the client level
documentClient = new DocumentClient(new Uri(endpoint), authKey, connectionPolicy, ConsistencyLevel.Eventual);

// Override consistency at the request level via request options
RequestOptions requestOptions = new RequestOptions { ConsistencyLevel = ConsistencyLevel.Eventual };

var response = await client.ReadDocumentAsync(collectionUri, document, requestOptions);

Java V4 SDK

Java SDK V4 (Maven com.azure::azure-cosmos) Async API


CosmosAsyncClient client =
        new CosmosClientBuilder()
                .endpoint(HOST)
                .key(MASTER_KEY)
                .consistencyLevel(ConsistencyLevel.EVENTUAL)
                .buildAsyncClient();

Java V2 SDK-k

Async Java V2 SDK (Maven com.microsoft.azure::azure-cosmosdb)

// Override consistency at the client level
ConnectionPolicy policy = new ConnectionPolicy();

AsyncDocumentClient client =
        new AsyncDocumentClient.Builder()
                .withMasterKey(this.accountKey)
                .withServiceEndpoint(this.accountEndpoint)
                .withConsistencyLevel(ConsistencyLevel.Eventual)
                .withConnectionPolicy(policy).build();

Node.js/JavaScript/TypeScript SDK

// Override consistency at the client level
const client = new CosmosClient({
  /* other config... */
  consistencyLevel: ConsistencyLevel.Eventual
});

// Override consistency at the request level via request options
const { body } = await item.read({ consistencyLevel: ConsistencyLevel.Eventual });

Python SDK

# Override consistency at the client level
connection_policy = documents.ConnectionPolicy()
client = cosmos_client.CosmosClient(self.account_endpoint, {
                                    'masterKey': self.account_key}, connection_policy, documents.ConsistencyLevel.Eventual)

Munkamenet-jogkivonatok használata

Az Azure Cosmos DB egyik konzisztenciaszintje a munkamenet-konzisztencia . Ez alapértelmezés szerint az Azure Cosmos DB-fiókokra alkalmazott alapértelmezett szint. A munkamenet-konzisztencia használatakor a rendszer minden új írási kérelmet hozzárendel az Azure Cosmos DB-hez egy új SessionToken-hez. A CosmosClient ezt a jogkivonatot belsőleg fogja használni minden olvasási/lekérdezési kéréssel annak érdekében, hogy a beállított konzisztenciaszint megmaradjon.

Bizonyos esetekben ezt a munkamenetet saját maga kell kezelnie. Fontolja meg egy több csomópontot tartalmazó webalkalmazást, minden csomópontnak saját CosmosClient-példánya lesz. Ha azt szeretné, hogy ezek a csomópontok ugyanabban a munkamenetben vegyenek részt (ahhoz, hogy a saját írásait egységesen olvashassák a webes szintek között), akkor a SessionTokent a FeedResponse T-ből> kell elküldenie<az írási műveletről a végfelhasználónak egy cookie vagy más mechanizmus használatával, és vissza kell állítania a jogkivonatot a webes szintre, és végső soron a CosmosClientet a későbbi olvasásokhoz. Ha olyan ciklikus időszeleteléses terheléselosztót használ, amely nem tartja fenn a munkamenet-affinitást a kérések( például az Azure Load Balancer) között, az olvasás esetleg egy másik csomópontra kerülhet az írási kérelemhez, ahol a munkamenet létrejött.

Ha az Azure Cosmos DB SessionToken nem halad át a fent leírt módon, egy ideig inkonzisztens olvasási eredményekhez vezethet.

Az Azure Cosmos DB munkamenet-jogkivonatai partícióhoz kötöttek, ami azt jelenti, hogy kizárólag egy partícióhoz vannak társítva. Annak érdekében, hogy biztosan elolvashassa az írásait, használja az adott elem(ek)hez legutóbb létrehozott munkamenet-jogkivonatot. A munkamenet-jogkivonatok manuális kezeléséhez kérje le a munkamenet-jogkivonatot a válaszból, és állítsa be kérésenként. Ha nem kell manuálisan kezelnie a munkamenet-jogkivonatokat, nem kell ezeket a mintákat használnia. Az SDK automatikusan nyomon követi a munkamenet-jogkivonatokat. Ha nem állítja be manuálisan a munkamenet-jogkivonatot, alapértelmezés szerint az SDK a legutóbbi munkamenet-jogkivonatot használja.

.NET SDK

var response = await client.ReadDocumentAsync(
                UriFactory.CreateDocumentUri(databaseName, collectionName, "SalesOrder1"));
string sessionToken = response.SessionToken;

RequestOptions options = new RequestOptions();
options.SessionToken = sessionToken;
var response = await client.ReadDocumentAsync(
                UriFactory.CreateDocumentUri(databaseName, collectionName, "SalesOrder1"), options);

Java V4 SDK

Java SDK V4 (Maven com.azure::azure-cosmos) Async API


// Get session token from response
CosmosItemResponse<JsonNode> response = container.readItem(itemId, new PartitionKey(partitionKey), JsonNode.class).block();
String sessionToken = response.getSessionToken();

// Resume the session by setting the session token on the RequestOptions
CosmosItemRequestOptions options = new CosmosItemRequestOptions();
options.setSessionToken(sessionToken);
CosmosItemResponse<JsonNode> response2 = container.readItem(itemId, new PartitionKey(partitionKey), JsonNode.class).block();

Java V2 SDK-k

Async Java V2 SDK (Maven com.microsoft.azure::azure-cosmosdb)

// Get session token from response
RequestOptions options = new RequestOptions();
options.setPartitionKey(new PartitionKey(document.get("mypk")));
Observable<ResourceResponse<Document>> readObservable = client.readDocument(document.getSelfLink(), options);
readObservable.single()           // we know there will be one response
  .subscribe(
      documentResourceResponse -> {
          System.out.println(documentResourceResponse.getSessionToken());
      },
      error -> {
          System.err.println("an error happened: " + error.getMessage());
      });

// Resume the session by setting the session token on RequestOptions
RequestOptions options = new RequestOptions();
requestOptions.setSessionToken(sessionToken);
Observable<ResourceResponse<Document>> readObservable = client.readDocument(document.getSelfLink(), options);

Node.js/JavaScript/TypeScript SDK

// Get session token from response
const { headers, item } = await container.items.create({ id: "meaningful-id" });
const sessionToken = headers["x-ms-session-token"];

// Immediately or later, you can use that sessionToken from the header to resume that session.
const { body } = await item.read({ sessionToken });

Python SDK

// Get the session token from the last response headers
item = client.ReadItem(item_link)
session_token = client.last_response_headers["x-ms-session-token"]

// Resume the session by setting the session token on the options for the request
options = {
    "sessionToken": session_token
}
item = client.ReadItem(doc_link, options)

A valószínűség alapján korlátozott frissesség (PBS) metrika monitorozása

Mennyire végleges a végleges konzisztencia? Az átlagos esetben a verzióelőzmények és az idő tekintetében elavultsági korlátokat kínálhatunk. A probabilisan határolt elavultság (PBS) metrika megpróbálja számszerűsíteni az elavultság valószínűségét, és metrikaként jeleníti meg.

A PBS-metrikák megtekintéséhez nyissa meg az Azure Cosmos DB-fiókját az Azure Portalon. Nyissa meg a Metrikák (klasszikus) panelt, és válassza a Konzisztencia lapot. Tekintse meg a számítási feladat alapján az erősen konzisztens olvasások valószínűségének valószínűségét (lásd a PBS-t).

PBS-grafikon az Azure Portalon

Következő lépések

További információ az adatütközések kezeléséről, illetve az Azure Cosmos DB következő kulcsfogalmának továbblépéséről. Tekintse meg az alábbi cikkeket: