יכול להיות שיהיה צורך לבצע שרדינג (או פיצול פידים לכמה קבצים) בהתאם למלאי שלכם.
מתי כדאי להשתמש ב-sharding
גודל הפיד גדול מ-200MB לקובץ אחד (אחרי דחיסת gzip).
- דוגמה: פיד הזמינות שנוצר הוא בנפח 1GB. הקובץ צריך להיות מחולק ל-5 קבצים נפרדים לפחות (או לחלקים).
מלאי שטחי הפרסום של השותף מפוזר במערכות או באזורים שונים, ולכן קשה לבצע התאמה בין מלאי שטחי הפרסום.
- דוגמה: למפרסם יש מלאי שטחי פרסום בארה"ב ובאיחוד האירופי, שמאוחסן במערכות נפרדות. יכול להיות שהפיד ייווצר עם 2 קבצים (או שברים), אחד לארה"ב ואחד לאיחוד האירופי, עם אותם
nonceוgeneration_timestamp.
- דוגמה: למפרסם יש מלאי שטחי פרסום בארה"ב ובאיחוד האירופי, שמאוחסן במערכות נפרדות. יכול להיות שהפיד ייווצר עם 2 קבצים (או שברים), אחד לארה"ב ואחד לאיחוד האירופי, עם אותם
הנחיות כלליות
- הגודל של כל רסיס לא יכול לחרוג מ-200MB לקובץ אחד (אחרי דחיסת gzip).
- מומלץ להשתמש ב-20 רסיסים לכל היותר לכל פיד. אם יש לכם הצדקה עסקית שדורשת סכום גבוה יותר, אתם יכולים לפנות לתמיכה לקבלת הוראות נוספות.
-
צריך לשלוח רשומות בודדות (לדוגמה, אובייקט
Merchantאחד) בשבר אחד, ולא לפצל אותן בין כמה שברים. עם זאת, אין צורך לשלוח אותם בשבר עם אותוshard_numberבפידים עתידיים. - כדי לשפר את הביצועים, צריך לפצל את הנתונים באופן שווה בין הרסיסים, כך שגודל כל הקבצים המפוצלים יהיה דומה.
איך מפצלים פידים
לכל קובץ (או שבר), מגדירים את FeedMetadata לערכים הבאים:
processing_instructionהוגדר לערךPROCESS_AS_COMPLETE.-
shard_numberמוגדר לשבר הנוכחי של הפיד (החל מ-0 עדtotal_shards– 1 ללא הפסקות) -
total_shardsמוגדר למספר הכולל של הרסיסים בפיד (החל מ-1). -
nonceמוגדר כמזהה ייחודי שזהה בכל השברים של אותו פיד, אבל שונה מהערך של פידים אחרים. -
generation_timestampהיא חותמת הזמן בפורמט Unix ו-EPOCH. הערך הזה צריך להיות זהה בכל חלקי הפיד.
מומלץ: לכל קובץ (או חלק), צריך להגדיר את שם הקובץ כך שיציין את סוג הפיד, חותמת הזמן, מספר החלק והמספר הכולל של החלקים. הנתונים בכל שארד צריכים להיות בערך באותו גודל, והם יעברו עיבוד רק אחרי שכל השארדים יועלו.
Example:“availability_feed_1574117613_001_of_002.json.gz”
דוגמה לפיד זמינות מחולק
רסיס 0
{
"metadata": {
"processing_instruction": "PROCESS_AS_COMPLETE",
"shard_number": 0,
"total_shards": 3,
"nonce": "111111",
"generation_timestamp": 1524606581
},
"service_availability": [
{
"availability": [
{
"spots_total": 1,
"spots_open": 1,
"duration_sec": 3600,
"service_id": "1000",
"start_sec": 1577275200,
"merchant_id": "merchant1",
"confirmation_mode": "CONFIRMATION_MODE_SYNCHRONOUS"
}
]
}
]
}רסיס 1
{
"metadata": {
"processing_instruction": "PROCESS_AS_COMPLETE",
"shard_number": 1,
"total_shards": 3,
"nonce": "111111",
"generation_timestamp": 1524606581
},
"service_availability": [
{
"availability": [
{
"spots_total": 1,
"spots_open": 1,
"duration_sec": 3600,
"service_id": "1000",
"start_sec": 1577620800,
"merchant_id": "merchant2",
"confirmation_mode": "CONFIRMATION_MODE_SYNCHRONOUS"
}
]
}
]
}Shard 2
{
"metadata": {
"processing_instruction": "PROCESS_AS_COMPLETE",
"shard_number": 2,
"total_shards": 3,
"nonce": "111111",
"generation_timestamp": 1524606581
},
"service_availability": [
{
"availability": [
{
"spots_total": 1,
"spots_open": 1,
"duration_sec": 3600,
"service_id": "1000",
"start_sec": 1576670400,
"merchant_id": "merchant3",
"confirmation_mode": "CONFIRMATION_MODE_SYNCHRONOUS"
}
]
}
]
}שימוש בפיצול (sharding) למלאי שטחי פרסום מבוזר של שותפים
יכול להיות שיהיה קשה לשותפים לאחד מלאי שמופץ בכמה מערכות או אזורים לפיד אחד. אפשר להשתמש ב-Sharding כדי לפתור בעיות בהתאמה על ידי הגדרת כל Shard כך שיתאים לסט המלאי של כל מערכת מבוזרת.
לדוגמה, נניח שמלאי שטחי הפרסום של שותף מסוים מחולק ל-2 אזורים (מלאי שטחי פרסום בארה"ב ובאיחוד האירופי), שמופיעים ב-2 מערכות נפרדות.
השותף יכול לפצל כל פיד ל-2 קבצים (או רסיסים):
- פיד מוֹכר: 2 רסיסים, אחד לארה"ב ואחד לאיחוד האירופי
- פיד שירותים: 2 רסיסים, אחד לארה"ב ואחד לאיחוד האירופי
- פיד זמינות: 1 shard לארה"ב, 1 shard לאיחוד האירופי
כדי לוודא שהפידים יעברו עיבוד בצורה תקינה, צריך לפעול לפי השלבים הבאים:
- מחליטים על לוח זמנים להעלאות ומגדירים כל מופע של מלאי שטחי פרסום כך שיפעל לפי לוח הזמנים.
- מקצים מספרי שבר ייחודיים לכל מופע (לדוגמה, ארה"ב = N, האיחוד האירופי = N + 1).
מגדירים את
total_shardsלמספר הכולל של הרסיסים. - בכל פעם שמתבצעת העלאה מתוזמנת, צריך להחליט על
generation_timestampועלnonce. בשדהFeedMetadata, מגדירים את כל המופעים כך שיכילו את אותם ערכים בשני השדות האלה.-
generation_timestampצריך להיות התאריך הנוכחי או תאריך מהעבר הקרוב (מומלץ להשתמש בחותמת הזמן של מסד הנתונים של השותף)
-
- אחרי שכל הרסיסים מועלים, Google מקבצת את הרסיסים באמצעות
generation_timestampו-nonce.
Google תעבד את הפיד כפיד אחד, למרות שכל חלק מייצג אזור שונה במלאי של השותף ויכול להיות שיועלה בשעה אחרת ביום, כל עוד הערך של generation_timestamp זהה בכל החלקים.
דוגמה לפיד זמינות מחולק לפי אזור
Shard 0 - US Inventory
{
"metadata": {
"processing_instruction": "PROCESS_AS_COMPLETE",
"shard_number": 0,
"total_shards": 2,
"nonce": "111111",
"generation_timestamp": 1524606581
},
"service_availability": [
{
"availability": [
{
"spots_total": 1,
"spots_open": 1,
"duration_sec": 3600,
"service_id": "1000",
"start_sec": 1577275200,
"merchant_id": "US_merchant_1",
"confirmation_mode": "CONFIRMATION_MODE_SYNCHRONOUS"
}
]
}
]
}Shard 1 - EU Inventory
{
"metadata": {
"processing_instruction": "PROCESS_AS_COMPLETE",
"shard_number": 1,
"total_shards": 2,
"nonce": "111111",
"generation_timestamp": 1524606581
},
"service_availability": [
{
"availability": [
{
"spots_total": 1,
"spots_open": 1,
"duration_sec": 3600,
"service_id": "1000",
"start_sec": 1577620800,
"merchant_id": "EU_merchant_1",
"confirmation_mode": "CONFIRMATION_MODE_SYNCHRONOUS"
}
]
}
]
}