קבצים של פידים מחולקים

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

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

  • הפיד גדול מ-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"
        }
      ]
    }
  ]
}