В зависимости от вашего инвентаря может потребоваться сегментирование (или разбиение каналов на несколько файлов).
Когда использовать шардинг
Размер фида превышает 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"
}
]
}
]
}