В зависимости от вашего инвентаря может потребоваться сегментирование (или разбиение каналов на несколько файлов).
Когда использовать шардинг
Фид превышает 200 МБ на 1 файл (после сжатия gzip).
- Пример: размер созданного канала доступности составляет 1 ГБ. Это должно быть разбито на 5+ отдельных файлов (или осколков).
Ресурсы партнеров распределены по системам и/или регионам, что затрудняет их сверку.
- Пример. У партнера есть инвентарь в США и ЕС, который находится в разных системах. Фид может быть сгенерирован из двух файлов (или фрагментов): 1 для США и 1 для ЕС с одинаковыми
nonce
иgeneration_timestamp
.
- Пример. У партнера есть инвентарь в США и ЕС, который находится в разных системах. Фид может быть сгенерирован из двух файлов (или фрагментов): 1 для США и 1 для ЕС с одинаковыми
Общие правила
- Размер каждого шарда не может превышать 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 осколок для ЕС.
Чтобы обеспечить правильную обработку каналов, выполните следующие действия:
- Определите график загрузки и настройте каждый экземпляр инвентаря так, чтобы он следовал этому расписанию.
- Назначьте уникальные номера шардов для каждого экземпляра (например, US = N, EU = N + 1). Установите
total_shards
на общее количество осколков. - В каждое запланированное время загрузки определите
generation_timestamp
иnonce
. ВFeedMetadata
задайте для всех экземпляров одинаковые значения для этих двух полей.-
generation_timestamp
должно быть текущим или недавним прошлым (в идеале — временная метка чтения базы данных партнера).
-
- После того, как все шарды загружены, 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" } ] } ] }