عندما نعمل مع قاعدة بيانات، فإن تحسين الأداء أمر حاسم ومفتاح لفعالية التطبيق وكفاءته. وبالمثل، في Azure Cosmos DB، فإن التحسين أمر بالغ الأهمية لتعظيم الكفاءة، وتقليل التكاليف، وضمان أن يتوسع تطبيقك بشكل فعال. فيما يلي بعض من أفضل الممارسات مع أمثلة برمجية لتحسين الأداء في Azure Cosmos DB.
1. اختيار مفتاح التقسيم الصحيح
اختيار مفتاح تقسيم مناسب أمر حيوي لقواعد البيانات الموزعة مثل Cosmos DB. يضمن مفتاح التقسيم الجيد توزيع البيانات بشكل متساوٍ عبر الأقسام، مما يقلل من النقاط الساخنة ويحسن الأداء.
اختيار مفتاح التقسيم بسيط ولكنه مهم جداً في مرحلة التصميم في Azure Cosmos DB. بمجرد أن نختار مفتاح التقسيم، فلا يمكن تغييره في مكانه.
أفضل ممارسة
- اختر مفتاح تقسيم ذو كثافة عالية (الكثير من القيم الفريدة).
- تأكد من أنه يوزع عمليات القراءة والكتابة بشكل متساوٍ.
- احتفظ بالبيانات ذات الصلة معًا لتقليل الاستعلامات عبر الأقسام.
مثال: إنشاء حاوية بمفتاح تقسيم مثالي
var database = await cosmosClient.CreateDatabaseIfNotExistsAsync("YourDatabase");
var containerProperties = new ContainerProperties
{
Id = "myContainer",
PartitionKeyPath = "/customerId" // Partition key selected to ensure balanced distribution
};
// إنشاء الحاوية مع 400 RU/s معدل تدفق موفر
var container = await database.CreateContainerIfNotExistsAsync(containerProperties, throughput: 400);
2. الفهرسة بشكل صحيحفاستخدم الفهرسة
في Azure Cosmos DB، يتم تطبيق الفهارس على جميع الخصائص افتراضيًا، مما قد يكون مفيدًا ولكن قد يؤدي إلى زيادة تكاليف التخزين ووحدات الطلب. لتعزيز أداء الاستعلام وتقليل التكاليف، يُنصح بتخصيص سياسة الفهرسة. يدعم Cosmos DB ثلاثة أنواع من الفهارس: فهارس النطاق، فهارس المكان، وفهارس مركبة. استخدم النوع المناسب بحكمة.
أفضل الممارسات
- استبعد الحقول غير الضرورية من الفهرسة.
- استخدم فهارس مركبة للاستعلامات متعددة الحقول.
مثال: سياسة فهرسة مخصصة
{
"indexingPolicy": {
"automatic": true,
"indexingMode": "consistent", // Can use 'none' or 'lazy' to reduce write costs
"includedPaths": [
{
"path": "/orderDate/?", // Only index specific fields like orderDate
"indexes": [
{
"kind": "Range",
"dataType": "Number"
}
]
}
],
"excludedPaths": [
{
"path": "/largeDataField/*" // Exclude large fields not used in queries
}
]
}
}
مثال: إضافة فهرس مركب لتحسين الاستعلام
{
"indexingPolicy": {
"compositeIndexes": [
[
{ "path": "/lastName", "order": "ascending" },
{ "path": "/firstName", "order": "ascending" }
]
]
}
}
يمكنك قراءة المزيد حول أنواع الفهارس هنا.
3. تحسين الاستعلامات
الاستعلام الفعال أمر أساسي لتقليل وحدات الطلب (RU/s) وتحسين الأداء في Azure Cosmos DB. تعتمد تكلفة RU/s على تعقيد الاستعلام وحجمه.
يمكن أن يقلل استخدام مُنفّذي العمليات الجماعية من التكاليف بمزيد من خفض وحدات الطلب المستهلكة لكل عملية. يساعد هذا التحسين في إدارة استخدام RU بفعالية وتقليل نفقاتك الإجمالية في Cosmos DB.
أفضل الممارسات
- استخدم استعلامات
SELECT
بكميات محدودة، واسترجع الخصائص اللازمة فقط. - تجنب الاستعلامات العابرة للأقسام عن طريق توفير مفتاح التقسيم في استعلامك.
- استخدم تصفيات على الحقول المفهرسة لتقليل تكاليف الاستعلام.
مثال: جلب سجل العميل
var query = new QueryDefinition("SELECT c.firstName, c.lastName FROM Customers c WHERE c.customerId = @customerId")
.WithParameter("@customerId", "12345");
var iterator = container.GetItemQueryIterator<Customer>(query, requestOptions: new QueryRequestOptions
{
PartitionKey = new PartitionKey("12345") // Provide partition key to avoid cross-partition query
});
while (iterator.HasMoreResults)
{
var response = await iterator.ReadNextAsync();
foreach (var customer in response)
{
Console.WriteLine($"{customer.firstName} {customer.lastName}");
}
}
4. ضبط مستويات التناسق
تحدد مستويات التناسق وضعيات تشغيلية محددة مصممة لتلبية ضمانات السرعة. هناك خمس مستويات تناسق (قوية، محدودة الاصطبار، جلسة، بادئة ثابتة، ونهائية) متوفرة في Cosmos DB. يؤثر كل مستوى تناسق على التأخير والتوفرية والإنتاجية.
أفضل الممارسات
- استخدم تناسق الجلسة لمعظم السيناريوهات لتحقيق توازن بين الأداء واتساق البيانات.
- يضمن التناسق القوي اتساق البيانات ولكنه يزيد من وحدات القراءة/الكتابة في الثانية (RU/s) والتأخير.
مثال: ضبط مستوى التناسق
var cosmosClient = new CosmosClient(
"",
"",
new CosmosClientOptions
{
// قم بتعيين التناسق إلى "جلسة" لتحقيق أداء متوازن
ConsistencyLevel = ConsistencyLevel.Session
});
اقرأ المزيد حول مستوى التناسق هنا.
5. استخدم القدرة المخصصة (RU/s) والتوسيع التلقائي بحكمة
تعد ضبط القدرة المخصصة عاملاً رئيسيًا في تحقيق كفاءة التكلفة والأداء الأمثل في Azure Cosmos DB. يتيح لك الخدمة تكوين القدرة المخصصة بطريقتين:
- RU/s الثابتة: مستوى ثابت محدد مسبقًا من وحدات الطلب في الثانية (RU/s)، مناسب لأعباء العمل ذات الطلبات الأداء المتناسبة.
- التوسيع التلقائي: خيار ديناميكي يعدل تلقائيًا القدرة المخصصة استنادًا إلى تقلبات العبء العملي، مما يوفر قابلية التوسع مع تجنب الإفراط في التوفير خلال فترات النشاط المنخفض.
اختيار نموذج القدرة المناسب يساعد على تحقيق توازن بين احتياجات الأداء وإدارة التكاليف بفعالية.
الممارسة الجيدة
- للاعباء العمل المتوقعة، قم بضبط القدرة المخصصة يدويًا.
- استخدم التوسيع التلقائي للاعباء العمل غير المتوقعة أو الانفجارية.
مثال: ضبط القدرة المخصصة بـالتوسيع التلقائي
var throughputProperties = ThroughputProperties.CreateAutoscaleThroughput(maxThroughput: 4000); // Autoscale up to 4000 RU/s
var container = await database.CreateContainerIfNotExistsAsync(new ContainerProperties
{
Id = "autoscaleContainer",
PartitionKeyPath = "/userId"
}, throughputProperties);
مثال: ضبط RU/s الثابتة يدويًا للاعباء العمل المستقرة
var container = await database.CreateContainerIfNotExistsAsync(new ContainerProperties
{
Id = "manualThroughputContainer",
PartitionKeyPath = "/departmentId"
}, throughput: 1000); // Fixed 1000 RU/s
6. استفد من تغذية التغيير لمعالجة الوقت الحقيقي بكفاءة
يسمح تغذية التغيير بمعالجة الأحداث في الوقت الحقيقي من خلال التقاط التغييرات في قاعدة البيانات تلقائيًا، مما يقضي على الحاجة إلى الاستطلاع. وهذا يقلل من العبء الناتج عن الاستعلام ويعزز الكفاءة.
أفضل الممارسات
- استخدم تغذية التغيير في السيناريوهات التي تتطلب معالجة تغييرات البيانات في الوقت الحقيقي (مثل التحليلات في الوقت الحقيقي، والإشعارات، والتنبيهات).
مثال: قراءة من تغذية التغيير
var iterator = container.GetChangeFeedIterator(
ChangeFeedStartFrom.Beginning(),
ChangeFeedMode.Incremental);
while (iterator.HasMoreResults)
{
var changes = await iterator.ReadNextAsync();
foreach (var change in changes)
{
Console.WriteLine($"Detected change: {change.Id}");
// قم بمعالجة التغيير (مثل تنشيط الحدث، وتحديث الذاكرة المؤقتة)
}
}
7. استخدام الوقت المحدد للاستخدام (TTL) لانتهاء البيانات تلقائيًا
إذا كانت لديك بيانات ذات صلة فقط لفترة محدودة، مثل السجلات أو بيانات الجلسة، يمكن أن يساعد تمكين الوقت المحدد للاستخدام (TTL) في قاعدة بيانات Azure Cosmos DB على إدارة تكاليف التخزين. يقوم TTL تلقائيًا بحذف البيانات التي انتهت صلاحيتها بعد فترة الاحتفاظ المحددة، مما يقضي على الحاجة إلى تنظيف البيانات يدويًا. وتساهم هذه الطريقة ليس فقط في تقليل كمية البيانات المخزنة ولكن أيضًا في ضمان تحسين قاعدة البيانات الخاصة بك لتحقيق كفاءة التكلفة من خلال إزالة المعلومات القديمة أو غير الضرورية.
أفضل الممارسات
- قم بتعيين TTL لحاويات حيث يجب أن تنتهي البيانات تلقائيًا لتقليل تكاليف التخزين.
مثال: تعيين الوقت المحدد للاستخدام (TTL) لانتهاء البيانات
{
"id": "sessionDataContainer",
"partitionKey": { "paths": ["/sessionId"] },
"defaultTtl": 3600 // 1 hour (3600 seconds)
}
في قاعدة بيانات كوزموس،القيمة القصوى لعمر البيانات (TTL) التي يمكن تعيينها هي 365 يومًا (سنة واحدة). هذا يعني أنه يمكن حذف البيانات تلقائيًا بعد انتهاء صلاحيتها خلال عام من الإنشاء أو آخر تعديل، حسب كيفية تكوين TTL.
8. تجنب الاستعلامات عبر الأقسام
يمكن أن تؤدي الاستعلامات عبر الأقسام إلى زيادة كبيرة في RU/s والكمون. لتجنب ذلك:
أفضل الممارسات
- قم دائمًا بتضمين مفتاح القسم في استعلاماتك.
- صمم استراتيجية القسم الخاصة بك لتقليل الوصول عبر الأقسام.
مثال: الاستعلام باستخدام مفتاح القسم لتجنب الاستعلام عبر الأقسام
var query = new QueryDefinition("SELECT * FROM Orders o WHERE o.customerId = @customerId")
.WithParameter("@customerId", "12345");
var resultSetIterator = container.GetItemQueryIterator<Order>(query, requestOptions: new QueryRequestOptions
{
PartitionKey = new PartitionKey("12345")
});
while (resultSetIterator.HasMoreResults)
{
var response = await resultSetIterator.ReadNextAsync();
foreach (var order in response)
{
Console.WriteLine($"Order ID: {order.Id}");
}
}
الخاتمة
هذه النصائح فعالة جدًا أثناء التطوير. من خلال تنفيذ استراتيجية تقسيم فعالة، وتخصيص سياسات الفهرسة، وتحسين الاستعلامات، وضبط مستويات التناسق، واختيار نماذج توفير الإنتاجية المناسبة، يمكنك تحسين أداء وكفاءة نشر قاعدة بيانات Azure Cosmos DB الخاصة بك بشكل كبير. هذه التحسينات لا تعزز فقط القابلية للتوسع ولكنها تساعد أيضًا في إدارة التكاليف مع توفير تجربة قاعدة بيانات عالية الأداء.
Source:
https://dzone.com/articles/optimizing-performance-in-azure-cosmos-db