כאשר אנו עובדים עם מסד נתונים, אופטימיזציה היא קריטית ומרכזית במונחי ביצועי אפליקציה ויעילות. באופן דומה, ב־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 יחידות קריאה/כתיבה מובטחות
var container = await database.CreateContainerIfNotExistsAsync(containerProperties, throughput: 400);
2. נכוןשימוש אינדקס
ב- Azure Cosmos DB, אינדקסים מיושמים על כל המאפיינים כברירת מחדל, מה שיכול להיות מועיל אך עשוי לגרום להגברת עלויות אחסון ויחידות פעולה (RU/s). כדי לשפר ביצועי שאילתות ולהפחית עלויות, שקול להתאים אישית את מדיניות האינדקסים. Cosmos DB תומך בשלושה סוגי אינדקסים: אינדקסים של טווח, אינדקסים מרחביים ואינדקסים מרוכבים. השתמש בסוג הנכון בצורה חכמה.
Best Practice
- התעלם משדות מיותרים באינדקסים.
- השתמש באינדקסים מרוכבים לשאילתות על מספר שדות.
דוגמה: מדיניות אינדקסים מותאמת אישית
{
"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 שנצרכות לכל פעולה. האופטימיזציה הזו עוזרת לנהל ביעילות את שימוש ב- 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. כל רמת עדכנות משפיעה על לטנציה, זמינות וכמית העברת נתונים.
שיטה מומלצת
- השתמש ברמת עדכנות של סשן לרוב התרחישים כדי לאיזון בין ביצועים ועדכנות של נתונים.
- העדכנות החזקה מבטיחה עדכנות של נתונים אך מעלה את רמת היחידות הפעולה לשנייה ואת האיחוד.
דוגמה: הגדרת רמת עדכנות
var cosmosClient = new CosmosClient(
"",
"",
new CosmosClientOptions
{
// הגדר עדכנות ל"סשן" לביצועים מאוזנים
ConsistencyLevel = ConsistencyLevel.Session
});
קרא עוד על רמת העדכנות כאן.
5. שימוש בקצב עיבוד מקוצר (RU/s) ואוטומציה בצורה חכמה
הקצב עיבוד הוא גורם מכריע בהשגת יעילות עלות וביצועים אופטימליים ב-Azure Cosmos DB. השירות מאפשר לך להגדיר קצב עיבוד בשני אופנים:
- RU/s קבוע: רמת יחידות בקשה (RU/s) קבועה מראש, המתאימה לעומסי עבודה עם דרישות ביצוע קבועות.
- Auto-Scale: אפשרות דינמית שמתאימה באופן אוטומטי את הקצב העיבוד בהתאם לשינויים בעומס העבודה, מספקת התרחבות בקנה מידה במניעת קבוצת יתר בתקופות של פעילות נמוכה.
בחירת הדגם המתאים של קצב העיבוד עוזרת לאזן בין צרכי הביצועים לניהול העלויות בצורה יעילה.
שיטת פעולה מומלצת
- לעומסי עבודה צפויים, כדאי להגדיר את קצב העיבוד ידנית.
- השתמש באוטומציה עבור עומסי עבודה שאינם צפויים או תוקפים.
דוגמה: הגדרת קצב עיבוד עם אוטומציה
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)
}
ב-Cosmos DB, הערך המרבי של זמן החיים (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