קובצי פיד נפרדים (קודמים)

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

מתי כדאי להשתמש בחיתוך

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

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

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

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

  • כל פיצול לא יכול לחרוג מ- 200 MB לקובץ אחד (לאחר דחיסת 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"
        }
      ]
    }
  ]
}

פיצול 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) למלאי מבוזר על ידי שותפים

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

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

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

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

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

  1. צריך לקבוע לוח זמנים להעלאה ולהגדיר כל מופע של מלאי שטחי הפרסום כך שיפעל לפי לוח הזמנים.
  2. יש להקצות מספרי פיצול ייחודיים לכל מכונה (למשל: US = N, EU = 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"
        }
      ]
    }
  ]
}