חלוקה של קובצי פיד

בהתאם למלאי שטחי הפרסום שלכם, יכול להיות שתצטרכו לבצע חלוקה למקטעים (או לפצל פידים למספר קבצים).

מתי כדאי להשתמש בחלוקה לפלחים

  • הפיד גדול מ-200MB בקובץ אחד (אחרי דחיסת gzip).

    • דוגמה: נפח הפיד שנוצר של זמינות הוא 1GB. צריך לחלק את הנתונים ל-5 קובצי משנה (או קטעים) נפרדים לפחות.
  • מלאי שטחי הפרסום של השותפים מחולק בין מערכות ו/או אזורים, וכתוצאה מכך קשה להתאים את מלאי שטחי הפרסום.

    • דוגמה: לשותף יש מלאי שטחי פרסום בארה"ב ובאיחוד האירופי שנמצאים במערכות נפרדות. הפיד יכול להיווצר עם 2 קבצים (או פלחים), אחד לארה"ב ועוד אחד לאיחוד האירופי, עם אותם nonce ו-generation_timestamp.

הנחיות כלליות

  • כל שבר לא יכול לחרוג מ-200MB לקובץ אחד (אחרי דחיסת gzip).
  • מומלץ ליצור עד 20 פלחים לכל פיד. אם יש לכם הצדקה עסקית לצורך סכום גבוה יותר, תוכלו לפנות לתמיכה לקבלת הוראות נוספות.
  • יש לשלוח רשומות בודדות (למשל, אובייקט Merchant אחד) בחלוקה אחת, ואי אפשר לפצל אותן לכמה חלוקות. עם זאת, אין צורך לשלוח אותם באותה shard_number בפלחים של פידים עתידיים.
  • כדי לשפר את הביצועים, כדאי לפצל את הנתונים באופן שווה בין הפלחים, כך שכל הקבצים המפוצלים יהיו בגודל דומה.

איך לפצל פידים

לכל קובץ (או שבר), מגדירים את FeedMetadata כך:

  • processing_instructionהוגדר לערך PROCESS_AS_COMPLETE.
  • shard_number מוגדר לפי הפלח הנוכחי של הפיד (החל מ-0 עד total_shards - 1 ללא הפסקות)
  • total_shards מוגדר למספר המקצים הכולל של הפיד (החל מ-1).
  • nonce מוגדר למזהה ייחודי שזהה בכל הפיצולים של אותו פיד, אבל שונה מהערך של פידים אחרים. הערך של nonce חייב להיות מספר שלם חיובי (uint64).
  • generation_timestamp היא חותמת הזמן בפורמט יוניקס ו-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"
        }
      ]
    }
  ]
}

שריד 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"
        }
      ]
    }
  ]
}

שימוש בחלוקה לפלחים למלאי שטחי פרסום שמנוהל על ידי שותפים

יכול להיות שיהיו לשותפים קשיים לאחד מלאי שטחי הפרסום שמפוזר במספר מערכות או אזורים, בפיד אחד. אפשר להשתמש בחלוקה לקטעים כדי לפתור אתגרים של התאמה על ידי הגדרת כל מקטע כך שיתאים לקבוצת המלאי של כל מערכת מבוזרת.

לדוגמה, נניח שמלאי שטחי הפרסום של שותף מחולק לשני אזורים (מלאי שטחי פרסום בארה"ב וב-EU), שנמצאים בשתי מערכות נפרדות.

השותף יכול לפצל כל פיד לשני קבצים (או פלחים):

  • פיד של מוֹכרים: 1 פלחי לשוק בארה"ב, 1 פלחי לשוק באיחוד האירופי
  • פיד שירותים: 1 פלחי לארה"ב, 1 פלחי לאיחוד האירופי
  • פיד זמינות: 1 פלחי לארה"ב, 1 פלחי לאיחוד האירופי

כדי לוודא שהפידים מעובדים כראוי, יש לפעול לפי השלבים הבאים:

  1. קובעים לוח זמנים להעלאות ומגדירים כל מכונה של מלאי שטחי הפרסום לפעול בהתאם ללוח הזמנים.
  2. מקצים מספרים ייחודיים של פלחים לכל מכונה (למשל: ארה"ב = N, האיחוד האירופי = N + 1). מגדירים את total_shards למספר הכולל של שברי המטא-נתונים.
  3. בכל שעה מתוזמנת להעלאה, צריך להחליט על generation_timestamp ו-nonce. בקטע FeedMetadata, מגדירים את כל המופעים כך שיכילו את אותם ערכים בשני השדות האלה.
    • generation_timestamp צריך להיות תאריך נוכחי או תאריך מהזמן האחרון (רצוי חותמת הזמן של השותף לקריאה במסד הנתונים)
  4. אחרי העלאת כל השברים, Google מקבצת את השברים באמצעות generation_timestamp ו-nonce.

Google תעבד את הפיד כפיד אחד, למרות שכל שריד מייצג אזור שונה במלאי שטחי הפרסום של השותף, ואפשר להעלות אותו בשעה שונה ביום, כל עוד השדה generation_timestamp זהה בכל השברים.

דוגמה לפי אזור לפי פיד זמינות מפוצל

שריד 0 – מלאי שטחי פרסום בארה"ב

{
  "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"
        }
      ]
    }
  ]
}

שריד 1 – מלאי שטחי פרסום באיחוד האירופי

{
  "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"
        }
      ]
    }
  ]
}