إدارة مستويات التناسق في Azure Cosmos DB

ينطبق على: NoSQL

تشرح هذه المقالة كيفية إدارة مستويات التناسق في Azure Cosmos DB. تتعلم كيفية تكوين مستوى التناسق الافتراضي، وتجاوز التناسق الافتراضي، وإدارة الرموز المميزة للجلسة يدوياً، وفهم قياس الاستقرار المحدود الاحتمالي (PBS).

أثناء تغيير تناسق مستوى حسابك، تأكد من إعادة نشر التطبيقات وإجراء أي تعديلات ضرورية على التعليمات البرمجية لتطبيق هذه التغييرات.

إشعار

نوصي باستخدام الوحدة النمطية Azure Az PowerShell للتفاعل مع Azure. للبدء، راجع تثبيت Azure PowerShell. لمعرفة كيفية الترحيل إلى الوحدة النمطية Az PowerShell، راجع ترحيل Azure PowerShell من AzureRM إلى Az.

تكوين مستوى الاتساق الافتراضي

مستوى التناسق الافتراضي هو مستوى التناسق الذي يستخدمه العملاء افتراضياً.

لعرض مستوى التناسق الافتراضي أو تعديله، قم بتسجيل الدخول إلى مدخل Microsoft Azure. ابحث عن حساب Azure Cosmos DB الخاص بك، وافتح جزء التناسق الافتراضي. حدد مستوى التناسق الذي تريده كمستوى افتراضي جديد، ثم حدد Save. توفر مدخل Microsoft Azure أيضاً تصوراً لمستويات التناسق المختلفة مع الملاحظات الموسيقية.

Consistency menu in the Azure portal

تجاوز مستوى التناسق الافتراضي

يمكن للعملاء تجاوز مستوى التناسق الافتراضي الذي تم تعيينه بواسطة الخدمة. يمكن تعيين مستوى التناسق على أساس كل طلب، والذي يتجاوز مستوى التناسق الافتراضي الذي تم تعيينه على مستوى الحساب.

تلميح

لا يمكن تخفيف التناسق إلا على مثيل SDK أو مستوى الطلب. للانتقال من التناسق الأضعف إلى التناسق الأقوى، قم بتحديث التناسق الافتراضي لحساب Azure Cosmos DB.

تلميح

تجاوز مستوى الاتساق الافتراضي ينطبق فقط على القراءات داخل عميل SDK. سيظل الحساب الذي تم تكوينه لتحقيق اتساق قوي بشكل افتراضي يكتب البيانات وينسخها بشكل متزامن مع كل منطقة في الحساب. عندما يتخطى مثيل أو طلب عميل SDK هذا مع جلسة عمل أو اتساق أضعف، سيتم إجراء عمليات القراءة باستخدام نسخة متماثلة واحدة. لمزيد من التفاصيل، راجع مستويات الاتساق ومعدل النقل.

.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 SDKs

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)

استخدام الرموز المميزة للجلسة

أحد مستويات التناسق في Azure Cosmos DB هو اتساق الجلسة . هذا هو المستوى الافتراضي المطبق على حسابات Azure Cosmos DB بشكل افتراضي. عند العمل باستخدام تناسق الجلسة، يتم تعيين SessionToken جديد لكل طلب كتابة جديد إلى Azure Cosmos DB. سيستخدم CosmosClient هذا الرمز المميز داخلياً مع كل طلب قراءة/استعلام لضمان الحفاظ على مستوى التناسق المحدد.

في بعض السيناريوهات، تحتاج إلى إدارة جلسة العمل هذه بنفسك. ضع في اعتبارك تطبيق ويب يحتوي على عدة عقد، سيكون لكل عقدة مثيلها الخاص من CosmosClient. إذا كنت تريد أن تشارك هذه العقد في نفس جلسة العمل (لتكون قادرة على قراءة عمليات الكتابة الخاصة بك باستمرار عبر طبقات الويب) يجب عليك إرسال SessionToken من FeedResponse<T> لإجراء الكتابة إلى المستخدم النهائي باستخدام ملف تعريف ارتباط أو بعض الآليات الأخرى، وامتلاك هذا الرمز المميز يتدفق مرة أخرى إلى طبقة الويب وفي نهاية المطاف CosmosClient للقراءات اللاحقة. إذا كنت تستخدم موازن تحميل round-robin لا يحافظ على ترابط الجلسة بين الطلبات، مثل موازن تحميل Azure، فقد تنتقل القراءة إلى عقدة مختلفة لطلب الكتابة، حيث تم إنشاء جلسة العمل.

إذا لم تتدفق Azure Cosmos DB SessionToken عبر كما هو موضح أعلاه، فقد ينتهي بك الأمر بنتائج قراءة غير متناسقة لفترة من الوقت.

الرموز المميزة للجلسة في Azure Cosmos DB مرتبطة بالقسم، ما يعني أنها مرتبطة حصريا بقسم واحد. للتأكد من أنه يمكنك قراءة كتاباتك، استخدم الرمز المميز للجلسة الذي تم إنشاؤه آخر عنصر (عناصر) ذي صلة. لإدارة الرموز المميزة للجلسة يدوياً، احصل على رمز الجلسة من الاستجابة وقم بتعيينها لكل طلب. إذا لم تكن بحاجة إلى إدارة الرموز المميزة للجلسة يدوياً، فلن تحتاج إلى استخدام هذه العينات. تتعقب SDK الرموز المميزة للجلسة تلقائياً. إذا لم تقم بتعيين رمز الجلسة يدوياً، فستستخدم SDK افتراضياً أحدث رمز مميز للجلسة.

.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 SDKs

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)

مراقبة قياس الصلابة المحدود الاحتمالي (PBS)

كيف في نهاية المطاف هو الاتساق في نهاية المطاف؟ بالنسبة للحالة المتوسطة، يمكننا تقديم حدود قديمة فيما يتعلق بمحفوظات الإصدار والوقت. يحاول قياس Probabilistically Bounded Staleness (PBS) تحديد احتمالية الثبات وإظهاره كقياس.

لعرض مقياس PBS، انتقل إلى حساب Azure Cosmos DB في مدخل Microsoft Azure. افتح جزء Metrics (Classic)، وحدد علامة التبويب Consistency. انظر إلى الرسم البياني المسمى Probability of strongly consistent reads استنادا إلى حمل العمل (راجع PBS).

الرسم البياني PBS في مدخل Microsoft Azure

الخطوات التالية

تعرف على المزيد حول كيفية إدارة تعارض البيانات، أو انتقل إلى المفهوم الرئيسي التالي في Azure Cosmos DB. راجع المقالات التالية: