Dependendo do inventário, pode ser necessário fragmentar os feeds (ou dividir os feeds em vários arquivos).
Quando usar a fragmentação
O feed excede 200 MB para um arquivo (após a compactação em gzip).
- Exemplo:o feed de disponibilidade gerado é de 1 GB. Ele precisa ser fragmentado em mais de cinco arquivos separados (ou fragmentos).
O inventário do parceiro é distribuído entre sistemas e/ou regiões, resultando em dificuldades para reconciliar o inventário.
- Exemplo:o parceiro tem inventário dos EUA e da UE que reside em sistemas separados. O feed pode ser gerado com dois arquivos (ou fragmentos), um para os EUA e outro para a UE com os mesmos
nonce
egeneration_timestamp
.
- Exemplo:o parceiro tem inventário dos EUA e da UE que reside em sistemas separados. O feed pode ser gerado com dois arquivos (ou fragmentos), um para os EUA e outro para a UE com os mesmos
Regras gerais
- Cada fragmento não pode exceder 200 MB para um arquivo (após a compactação em gzip).
- Recomendamos no máximo 20 fragmentos por feed. Se você tiver uma justificativa comercial que exija um valor superior a esse, entre em contato com o suporte para receber mais instruções.
-
Registros individuais (um objeto
Merchant
, por exemplo) precisam ser enviados em um fragmento, e não podem ser divididos em vários fragmentos. No entanto, eles não precisam ser enviados no fragmento com o mesmoshard_number
para feeds futuros. - Para melhor desempenho, os dados precisam ser divididos uniformemente entre os fragmentos para que todos os arquivos fragmentados sejam de tamanhos semelhantes.
Como fragmentar feeds
Para cada arquivo (ou fragmento), defina FeedMetadata
como o
seguinte:
processing_instruction
definido comoPROCESS_AS_COMPLETE
.shard_number
definido como o fragmento atual do feed (de 0 atotal_shards
- 1 sem descontinuidades)total_shards
definido como o número total de fragmentos para o feed (a partir de 1).nonce
definido como um identificador exclusivo que é o mesmo em todos os fragmentos do mesmo feed, mas diferente do valor de outros feeds.generation_timestamp
é o carimbo de data/hora no formato Unix e EPOCH; Ele precisa ser o mesmo em todos os fragmentos do feed.
Recomendado:para cada arquivo (ou fragmento), defina o nome do arquivo para indicar o tipo de feed, o carimbo de data/hora, o número do fragmento e o total de fragmentos. Os fragmentos precisam ter aproximadamente o mesmo tamanho e são processados depois que é feito o upload de todos eles.
Example:
“availability_feed_1574117613_001_of_002.json.gz”
Exemplo de feed de disponibilidade fragmentado
Fragmento 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" } ] } ] }
Fragmento 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" } ] } ] }
Fragmento 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" } ] } ] }
Como usar a fragmentação para inventário distribuído por parceiro
Pode ser um desafio para os parceiros consolidar o inventário distribuído entre vários sistemas e/ou regiões em um único feed. A fragmentação pode ser usada para resolver desafios de reconciliação ao definir cada fragmento para corresponder ao conjunto de inventário de cada sistema distribuído.
Por exemplo, digamos que o inventário de um parceiro seja separado em duas regiões (inventário dos EUA e da UE), que residem em dois sistemas separados.
O parceiro pode dividir cada feed em dois arquivos (ou fragmentos):
- Feed de comerciantes: 1 fragmento para os EUA, 1 fragmento para a UE
- Feed de serviços: 1 fragmento para os EUA, 1 fragmento para a UE
- Feed de disponibilidade: 1 fragmento para os EUA, 1 fragmento para a UE
Siga as etapas abaixo para garantir que os feeds sejam processados corretamente:
- Decida uma programação de upload e configure cada instância do inventário para seguir a programação.
- Atribua números de fragmento exclusivos para cada instância (por exemplo, US = N, EU = N + 1).
Defina
total_shards
como o número total de fragmentos. - Em cada horário de upload programado, decida um
generation_timestamp
e umnonce
. EmFeedMetadata
, defina todas as instâncias para conter os mesmos valores desses dois campos.generation_timestamp
precisa ser um passado atual ou recente (preferencialmente, o carimbo de data/hora do banco de dados de leitura do parceiro)
- Depois do upload de todos os fragmentos, o Google os agrupa usando
generation_timestamp
enonce
.
O Google vai processar o feed como um, mesmo que cada fragmento represente uma
região diferente do inventário do parceiro e possa ser enviado em
outro horário do dia, desde que o generation_timestamp
seja igual em todos os fragmentos.
Exemplo de feed de disponibilidade fragmentado por região
Fragmento 0 – Inventário dos EUA
{ "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" } ] } ] }
Fragmento 1 – Inventário da UE
{ "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" } ] } ] }