Como fragmentar arquivos de feed

Dependendo do seu inventário, pode ser necessário fragmentar (ou dividir feeds em vários arquivos).

Quando usar a fragmentação

  • O feed excede 200 MB para 1 arquivo (após a compactação gzip).

    • Exemplo: o feed de disponibilidade gerado é de 1 GB. Ela é fragmentada para mais de cinco arquivos (ou fragmentos) separados.
  • O inventário de parceiros é distribuído em sistemas e/ou regiões que dificultam a reconciliação do inventário.

    • Exemplo: o parceiro tem um inventário dos EUA e da UE que residem em sistemas separados. O feed pode ser gerado com dois arquivos (ou fragmentos), um para os EUA e um para a UE com as mesmas nonce e generation_timestamp.

Regras gerais

  • Cada fragmento não pode exceder 200 MB para um arquivo (após a compactação gzip).
  • Recomendamos no máximo 20 fragmentos por feed. Se você tiver uma justificativa de negócios que exija um valor maior, entre em contato com o suporte para receber mais instruções.
  • Registros individuais (por exemplo, um objeto Merchant) precisam ser enviados em um fragmento. Eles não podem ser divididos em vários fragmentos. No entanto, eles não precisam ser enviados no fragmento com o mesmo shard_number para feeds futuros.
  • Para um melhor desempenho, os dados devem ser divididos igualmente entre os fragmentos, para que todos os arquivos fragmentados sejam semelhantes em tamanho.

Como fragmentar feeds

Para cada arquivo (ou fragmento), defina FeedMetadata como o seguinte:

  • processing_instruction definido como PROCESS_AS_COMPLETE.
  • shard_number definido como o fragmento atual do feed (de 0 a total_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 nos formatos unix e EPOCH. Ele deve 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 de fragmento e o número total de fragmentos. Os fragmentos precisam ter aproximadamente o mesmo tamanho e ser processados depois que todos eles forem enviados.

  • Example: "availability_feed_1574117613_001_of_002.json.gz"

Exemplo de feed de disponibilidade fragmentada

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 o inventário distribuído do 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 esteja separado em duas regiões (inventário dos EUA e da UE), que residem em dois sistemas distintos.

O parceiro pode dividir cada feed em dois arquivos (ou fragmentos):

  • Feed do comerciante: 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:

  1. Escolha uma programação de upload e configure cada instância do inventário para seguir a programação.
  2. Atribua números de fragmento exclusivos para cada instância (por exemplo, EUA = N, UE = N + 1). Defina total_shards como o número total de fragmentos.
  3. Para cada horário de upload programado, escolha um generation_timestamp e nonce. Em FeedMetadata, defina todas as instâncias para manter os mesmos valores para esses dois campos.
    • generation_timestamp precisa ser atual ou recente (o ideal é o carimbo de data/hora do banco de dados de leitura do parceiro)
  4. Depois que todos os fragmentos são enviados, o Google agrupa os fragmentos via generation_timestamp e nonce.

O Google processará o feed como um, mesmo que cada fragmento represente uma região diferente do inventário do parceiro e possa ser enviado em um horário diferente do dia, desde que o generation_timestamp seja o mesmo em todos os fragmentos.

Exemplo de feed de disponibilidade fragmentada 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"
        }
      ]
    }
  ]
}