Az Azure Cosmos DB konzisztenciaszintjeinek kezelése

A KÖVETKEZŐKRE VONATKOZIK: NoSQL

Ez a cikk azt ismerteti, 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égileg korlátozott frissessé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 minden szükséges kódmódosítást elvégez a módosítások alkalmazásához.

Megjegyzés

Javasoljuk, hogy az Azure-ral való interakcióhoz az Azure Az PowerShell-modult használja. Az első lépésekhez tekintse meg az Azure PowerShell telepítését ismertető szakaszt. 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 a Azure Portal. 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. A Azure Portal a különböző konzisztenciaszintek vizuális megjelenítését is biztosítja a zenejegyzetekkel.

Konzisztencia menü a Azure Portal

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 gyengébbről erősebb konzisztenciára 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 lásd: Konzisztenciaszintek és átviteli sebesség .

.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 . Alapértelmezés szerint ez az Azure Cosmos DB-fiókokra alkalmazott alapértelmezett szint. A munkamenet-konzisztencia használatakor az Azure Cosmos DB-nek küldött minden új írási kérelemhez új SessionToken lesz hozzárendelve. A CosmosClient ezt a jogkivonatot minden olvasási/lekérdezési kéréshez belsőleg fogja használni, hogy biztosítsa a beállított konzisztenciaszint fenntartását.

Bizonyos esetekben ezt a munkamenetet saját maga kell kezelnie. Vegyünk egy több csomóponttal rendelkező 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 (hogy a saját írásait folyamatosan olvashassák a webes szinteken), akkor az írási művelet SessionToken elemét a FeedResponse T-ből> kell elküldenie<a végfelhasználónak egy cookie vagy más mechanizmus használatával, és vissza kell állítania a jogkivonatot a webes szintre, végül pedig a CosmosClientre a későbbi olvasásokhoz. Ha ciklikus időszeleteléses terheléselosztót használ, amely nem tartja fenn a munkamenet-affinitást a kérések, például a 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étre lett hozva.

Ha nem halad át az Azure Cosmos DB SessionToken-on 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. Az írások olvasásának biztosítása érdekében használja a releváns 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 manuálisan állítja be a munkamenet-jogkivonatot, az SDK alapértelmezés szerint 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? Átlagos esetben kínálhatunk-e elavultsági korlátokat a verzióelőzmények és az idő tekintetében. A valószínűségileg korlátozott frissessé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 a Azure Portal. Nyissa meg a Metrikák (klasszikus) panelt, és válassza a Konzisztencia lapot. Tekintse meg az erős konzisztens olvasások valószínűségét a számítási feladat alapján (lásd a PBS-t) nevű grafikont.

PBS-diagram a Azure Portal

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ő fő koncepciójáról. Lásd az alábbi cikkeket: