Шардинг файлов каналов

В зависимости от вашего инвентаря может потребоваться сегментирование (или разбиение каналов на несколько файлов).

Когда использовать шардинг

  • Фид превышает 200 МБ на 1 файл (после сжатия gzip).

    • Пример: размер созданного канала доступности составляет 1 ГБ. Это должно быть разбито на 5+ отдельных файлов (или осколков).
  • Ресурсы партнеров распределены по системам и/или регионам, что затрудняет их сверку.

    • Пример. У партнера есть инвентарь в США и ЕС, который находится в разных системах. Фид может быть сгенерирован из двух файлов (или фрагментов): 1 для США и 1 для ЕС с одинаковыми nonce и generation_timestamp .

Общие правила

  • Размер каждого шарда не может превышать 200 МБ для 1 файла (после сжатия 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 — это отметка времени в формате 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 осколок для США, 1 осколок для ЕС.
  • Фид услуг: 1 сегмент для США, 1 сегмент для ЕС.
  • Фид доступности: 1 осколок для США, 1 осколок для ЕС.

Чтобы обеспечить правильную обработку каналов, выполните следующие действия:

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