פיצול קובצי פיד

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

מתי כדאי להשתמש בפיצול (sharding)

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

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

    • דוגמה: לשותף יש מלאי בארה"ב ובאיחוד האירופי שמתגורר במערכות נפרדות. ניתן ליצור את הפיד עם 2 קבצים (או פיצולים), אחד עבור ארה"ב ו-1 לאיחוד האירופי עם אותו 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"
        }
      ]
    }
  ]
}

פיצול 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"
        }
      ]
    }
  ]
}

שימוש בפיצול למלאי שטחי פרסום משותף

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

לדוגמה, נניח שהמלאי של השותף מחולק ל-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 זהה בכל הפיצולים.

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

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

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