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

יכול להיות שיהיה צורך לבצע שרדינג (או פיצול פידים לכמה קבצים) בהתאם למלאי שלכם.

מתי כדאי להשתמש ב-sharding

  • גודל הפיד גדול מ-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 מוגדר כמזהה ייחודי שזהה בכל השברים של אותו פיד, אבל שונה מהערך של פידים אחרים.
  • 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 לאיחוד האירופי

כדי לוודא שהפידים יעברו עיבוד בצורה תקינה, צריך לפעול לפי השלבים הבאים:

  1. מחליטים על לוח זמנים להעלאות ומגדירים כל מופע של מלאי שטחי פרסום כך שיפעל לפי לוח הזמנים.
  2. מקצים מספרי שבר ייחודיים לכל מופע (לדוגמה, ארה"ב = N, האיחוד האירופי = N + 1). מגדירים את total_shards למספר הכולל של הרסיסים.
  3. בכל פעם שמתבצעת העלאה מתוזמנת, צריך להחליט על generation_timestamp ועל nonce. בשדה FeedMetadata, מגדירים את כל המופעים כך שיכילו את אותם ערכים בשני השדות האלה.
    • generation_timestamp צריך להיות התאריך הנוכחי או תאריך מהעבר הקרוב (מומלץ להשתמש בחותמת הזמן של מסד הנתונים של השותף)
  4. אחרי שכל הרסיסים מועלים, 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"
        }
      ]
    }
  ]
}