فایل‌های فید شارد (میراث)

بسته به موجودی شما، ممکن است لازم باشد فیدها را به چندین فایل تقسیم کنید (sharding).

چه زمانی از شاردینگ استفاده کنیم؟

  • حجم فید برای ۱ فایل (پس از فشرده‌سازی gzip) از ۲۰۰ مگابایت بیشتر است.

    • مثال: فید دسترسی تولید شده ۱ گیگابایت است. این باید به بیش از ۵ فایل (یا تکه) جداگانه تقسیم شود.
  • موجودی شرکا در سیستم‌ها و/یا مناطق مختلف توزیع شده است که منجر به دشواری تطبیق موجودی می‌شود.

    • مثال: شریک موجودی ایالات متحده و اتحادیه اروپا دارد که در سیستم‌های جداگانه قرار دارند. فید ممکن است با ۲ فایل (یا شارد) تولید شود، ۱ فایل برای ایالات متحده و ۱ فایل برای اتحادیه اروپا با nonce و generation_timestamp یکسان.

قوانین عمومی

  • هر Shard برای یک فایل نمی‌تواند از ۲۰۰ مگابایت (پس از فشرده‌سازی gzip) تجاوز کند.
  • ما توصیه می‌کنیم بیش از ۲۰ شارد در هر فید نباشد. اگر توجیه تجاری شما به بیش از این مقدار نیاز دارد، لطفاً برای راهنمایی بیشتر با پشتیبانی تماس بگیرید.
  • رکوردهای تکی (مثلاً یک شیء Merchant ) باید در یک Shard ارسال شوند، نمی‌توان آنها را بین چندین Shard تقسیم کرد. با این حال، لازم نیست برای Feedهای بعدی در Shard با همان shard_number ارسال شوند.
  • برای عملکرد بهتر، داده‌های شما باید به طور مساوی بین Shardها تقسیم شوند تا اندازه همه فایل‌های Shard شده مشابه باشد.

How to shard feeds

برای هر فایل (یا shard)، FeedMetadata به صورت زیر تنظیم کنید:

  • processing_instruction روی PROCESS_AS_COMPLETE تنظیم شده است.
  • shard_number روی شارد فعلی فید تنظیم می‌شود (از ۰ شروع می‌شود تا total_shards - ۱ بدون ناپیوستگی‌ها)
  • total_shards برابر با تعداد کل خرده ریزهای فید (از ۱ شروع می‌شود) تنظیم می‌شود.
  • nonce روی یک شناسه منحصر به فرد تنظیم می‌شود که در تمام بخش‌های یک فید یکسان است اما با مقدار سایر فیدها متفاوت است.
  • generation_timestamp مهر زمانی در قالب یونیکس و EPOCH است. این باید در تمام بخش‌های فید یکسان باشد.

توصیه می‌شود: برای هر فایل (یا shard)، نام فایل را طوری تنظیم کنید که نوع فید، برچسب زمانی، شماره shard و تعداد کل shardها را نشان دهد. shardها باید تقریباً اندازه یکسانی داشته باشند و پس از آپلود همه shardها پردازش شوند.

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

شارد ۱

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

شارد ۲

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

استفاده از شاردینگ برای موجودی توزیع‌شده‌ی شرکا

تجمیع موجودی توزیع‌شده در چندین سیستم و یا منطقه در یک منبع واحد می‌تواند برای شرکا چالش‌برانگیز باشد. با تنظیم هر شارد برای مطابقت با مجموعه موجودی هر سیستم توزیع‌شده، می‌توان از شاردینگ برای حل چالش‌های تطبیق استفاده کرد.

برای مثال، فرض کنید موجودی یک شریک به دو منطقه (موجودی ایالات متحده و اتحادیه اروپا) تقسیم شده است که در دو سیستم جداگانه قرار دارند.

شریک می‌تواند هر فید را به ۲ فایل (یا تکه) تقسیم کند:

  • فید بازرگانان: ۱ شارد برای ایالات متحده، ۱ شارد برای اتحادیه اروپا
  • فید خدمات: ۱ شارد برای ایالات متحده، ۱ شارد برای اتحادیه اروپا
  • فید در دسترس بودن: ۱ شارد برای ایالات متحده، ۱ شارد برای اتحادیه اروپا

برای اطمینان از پردازش صحیح فیدها، مراحل زیر را دنبال کنید:

  1. یک برنامه آپلود تعیین کنید و هر نمونه از موجودی را طوری پیکربندی کنید که از این برنامه پیروی کند.
  2. برای هر نمونه، شماره‌های شارد منحصر به فرد اختصاص دهید (مثلاً US = N، EU = N + 1). total_shards را برابر با تعداد کل شاردها قرار دهید.
  3. در هر زمان بارگذاری برنامه‌ریزی‌شده، یک generation_timestamp و nonce انتخاب کنید. در FeedMetadata ، تمام نمونه‌ها را طوری تنظیم کنید که مقادیر یکسانی را برای این دو فیلد نگه دارند.
    • generation_timestamp باید مربوط به زمان حال یا گذشته نزدیک باشد (در حالت ایده‌آل، مربوط به زمان خواندن از پایگاه داده‌ی شریک باشد)
  4. بعد از اینکه همه Shardها آپلود شدند، گوگل Shardها را از طریق generation_timestamp و nonce گروه‌بندی می‌کند.

گوگل این فید را به عنوان یک واحد پردازش خواهد کرد، حتی اگر هر شارد نشان‌دهنده‌ی منطقه‌ی متفاوتی از موجودی شریک باشد و تا زمانی که generation_timestamp در تمام شارد‌ها یکسان باشد، می‌تواند در زمان‌های مختلفی از روز آپلود شود.

مثال فید دسترسی خرد شده بر اساس منطقه

موجودی شارد ۰ در ایالات متحده

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

شارد ۱ - موجودی اتحادیه اروپا

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