Fragmentar arquivos de feed

Dependendo do inventário, a fragmentação (ou a divisão de feeds em vários ) podem ser necessárias.

Quando usar a fragmentação

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

    • Exemplo:o feed de disponibilidade gerado tem 1 GB. Ela deve ser fragmentado para mais de 5 arquivos (ou fragmentos) separados.
  • O inventário do parceiro é distribuído entre sistemas e/ou regiões resultando em dificuldade para reconciliar o inventário.

    • Exemplo:o parceiro tem inventário dos EUA e da UE que ficam em um local separado sistemas. O feed pode ser gerado com dois arquivos (ou fragmentos), um para os EUA, e uma para UE com o mesmo nonce e generation_timestamp.
.

Regras gerais

  • Cada fragmento não pode exceder 200 MB para um arquivo (após a compactação gzip).
  • Recomendamos não mais do que 20 fragmentos por feed. Se você tiver uma justificativa comercial precisar de mais do que essa quantidade, entre em contato com o suporte para receber mais instruções.
  • Os registros individuais (um objeto Merchant, por exemplo) precisam ser enviados em um fragmento, elas não podem ser divididas 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, seus dados devem ser divididos igualmente entre para que todos os arquivos tenham tamanhos semelhantes.
.

Como fragmentar feeds

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

  • processing_instructiondefinido 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 é mesmo. em todos os fragmentos do mesmo feed, mas diferente do valor outros feeds.
  • generation_timestamp é o carimbo de data/hora em 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 número total de os fragmentos Os fragmentos devem ter aproximadamente o mesmo tamanho e são processados para que os fragmentos sejam carregados.

  • 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 fragmentação para inventário distribuído por parceiros

Pode ser um desafio para os parceiros consolidarem o inventário distribuído em vários sistemas e/ou regiões em um único feed. A fragmentação pode ser usados para resolver desafios de reconciliação, definindo cada fragmento para corresponder do conjunto de inventário do sistema distribuído.

Por exemplo, digamos que o inventário de um parceiro seja separado em duas regiões (EUA e UE ) que ficam em dois sistemas diferentes.

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:

  1. Escolha uma programação de upload e configure cada instância do inventário para seguir o cronograma.
  2. 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.
  3. Em cada horário de envio programado, escolha um generation_timestamp e nonce. Na FeedMetadata, defina todas as instâncias para conter os mesmos valores esses dois campos.
    • generation_timestamp precisa ser atual ou recente (preferencialmente, o carimbo de data/hora de leitura do banco de dados do parceiro)
  4. Depois que todos os fragmentos são enviados, o Google os agrupa usando generation_timestamp e nonce.
.

O Google processará o feed como um, mesmo que cada fragmento represente um em uma região diferente do inventário do parceiro e podem ser carregados um horário diferente do dia, desde que a generation_timestamp é 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"
        }
      ]
    }
  ]
}