Cómo fragmentar los archivos de feeds

Según tu inventario, es posible que sea necesario fragmentar (o dividir los feeds en varios archivos).

Cuándo usar la fragmentación

  • El feed supera los 200 MB para 1 archivo (después de la compresión gzip).

    • Ejemplo: El feed de disponibilidad generado es de 1 GB. Debe estar fragmentado en más de 5 archivos (o fragmentos) independientes.
  • El inventario del socio se distribuye entre los sistemas o las regiones, lo que tiene dificultades para conciliar el inventario.

    • Ejemplo: El socio tiene inventario de la UE y EE.UU. que se encuentra en sistemas separados. El feed se puede generar con 2 archivos (o fragmentos), 1 para EE.UU. y 1 para la UE con los mismos nonce y generation_timestamp.

Reglas Generales

  • Cada fragmento no puede exceder los 200 MB para un archivo (después de la compresión gzip).
  • No recomendamos usar más de 20 Shards por feed. Si tienes una justificación comercial que requiera más de esa cantidad, comunícate con el equipo de asistencia para obtener más instrucciones.
  • Los registros individuales (un objeto Merchant, por ejemplo) se deben enviar en un shard y no se pueden dividir en varios. Sin embargo, no es necesario que se envíen en el shard con el mismo shard_number para feeds futuros.
  • Para obtener un mejor rendimiento, tus datos deben dividirse de manera uniforme entre los shards, de modo que todos los archivos fragmentados tengan un tamaño similar.

Cómo fragmentar feeds

Para cada archivo (o fragmento), configura FeedMetadata de la siguiente manera:

  • processing_instruction configurado como PROCESS_AS_COMPLETE.
  • Se estableció shard_number en el fragmento actual del feed (de 0 a total_shards - 1 sin interrupciones)
  • total_shards configurado como la cantidad total de fragmentos para el feed (a partir de 1).
  • nonce se estableció en un identificador único que es el mismo en todos los fragmentos del mismo feed, pero diferente del valor de otros feeds.
  • generation_timestamp es la marca de tiempo en formato Unix y EPOCH. Debe ser igual en todos los fragmentos del feed.

Recomendado: Para cada archivo (o fragmento), configura el nombre del archivo a fin de indicar el tipo de feed, la marca de tiempo, el número de fragmento y la cantidad total de fragmentos. Los fragmentos deben tener aproximadamente el mismo tamaño y se procesan una vez que se suben todos los fragmentos.

  • Example: “availability_feed_1574117613_001_of_002.json.gz”

Ejemplo de feed de disponibilidad 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"
        }
      ]
    }
  ]
}

Usa la fragmentación para el inventario distribuido por socios

Puede ser difícil para los socios consolidar el inventario distribuido en varios sistemas o regiones en un solo feed. La fragmentación se puede usar para resolver desafíos de conciliación mediante la configuración de cada fragmento para que coincida con el conjunto de inventario de cada sistema distribuido.

Por ejemplo, supongamos que el inventario de un socio está separado en 2 regiones (inventario de EE.UU. y de la UE), que se encuentran en 2 sistemas distintos.

El socio puede dividir cada feed en 2 archivos (o fragmentos):

  • Feed de comercios: 1 Shard para EE.UU. y 1 Shard para la UE
  • Feed de servicios: 1 Shard para EE.UU. y 1 Shard para la UE
  • Feed de disponibilidad: 1 Shard para EE.UU. y 1 Shard para la UE

Siga estos pasos para asegurarse de que los feeds se procesen correctamente:

  1. Decide una programación de carga y configura cada instancia de inventario para que siga la programación.
  2. Asigne números de Shard únicos para cada instancia (p.ej., US = N, EU = N + 1). Establece total_shards en la cantidad total de fragmentos.
  3. En cada hora de carga programada, elige un generation_timestamp y un nonce. En FeedMetadata, configura todas las instancias para que mantengan los mismos valores en estos dos campos.
    • generation_timestamp debe ser un pasado actual o reciente (lo ideal sería la marca de tiempo de lectura en la base de datos del socio)
  4. Después de subir todos los fragmentos, Google los agrupa a través de generation_timestamp y nonce.

Google procesará el feed como uno aunque cada fragmento represente una región diferente del inventario del socio y se pueda subir en un momento diferente del día, siempre que el generation_timestamp sea el mismo en todos los fragmentos.

Ejemplo de feed de disponibilidad fragmentado por región

Shard 0 - Inventario de EE.UU.

{
  "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"
        }
      ]
    }
  ]
}

Shard 1 - Inventario de la 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"
        }
      ]
    }
  ]
}