Fragmentación de archivos de feeds (heredado)

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

Cuándo usar el sharding

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

    • Ejemplo: El feed de disponibilidad generado es de 1 GB. Debe fragmentarse en más de 5 archivos separados (o fragmentos).
  • El inventario de socios se distribuye en sistemas o regiones, lo que dificulta la conciliación del inventario.

    • Ejemplo: El socio tiene inventario de EE.UU. y la UE 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 el mismo nonce y generation_timestamp.

Reglas Generales

  • Cada fragmento no puede superar los 200 MB para 1 archivo (después de la compresión con gzip).
  • Te recomendamos que no uses más de 20 fragmentos por feed. Si tienes una justificación comercial que requiere más de ese importe, comunícate con el equipo de asistencia para obtener más instrucciones.
  • Los registros individuales (por ejemplo, un objeto Merchant) se deben enviar en un solo fragmento, ya que no se pueden dividir en varios fragmentos. Sin embargo, no es necesario que se envíen en el shard con el mismo shard_number para los feeds futuros.
  • Para obtener un mejor rendimiento, divide los datos de manera uniforme entre los Shards a fin de que todos tengan un tamaño similar.

Cómo fragmentar feeds

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

  • processing_instructionse establece en PROCESS_AS_COMPLETE.
  • shard_number se establece en la partición actual del feed (comenzando desde 0 hasta total_shards - 1 sin discontinuidades)
  • total_shards se establece en la cantidad total de fragmentos del feed (a partir de 1).
  • nonce establecido 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 el mismo en todos los fragmentos del feed.

Recomendación: Para cada archivo (o fragmento), establece el nombre del archivo de modo que indique el tipo de feed, la marca de tiempo, el número de fragmento y la cantidad total de fragmentos. Los fragmentos deben tener un tamaño aproximadamente igual y se procesan una vez que se suben todos.

  • 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 el sharding para el inventario distribuido de socios

Puede ser difícil para los socios consolidar el inventario distribuido en varios sistemas o regiones en un solo feed. El sharding se puede usar para resolver los desafíos de conciliación. Para ello, se configura cada fragmento de modo que coincida con el conjunto de inventario de cada sistema distribuido.

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

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

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

Sigue los pasos que se indican a continuación para asegurarte de que los feeds se procesen correctamente:

  1. Decide un programa de carga y configura cada instancia del inventario para que lo siga.
  2. Asigna números de fragmentos únicos para cada instancia (p. ej., EE.UU. = N, UE = N + 1). Establece total_shards en la cantidad total de fragmentos.
  3. En cada hora de carga programada, decide un generation_timestamp y un nonce. En FeedMetadata, establece todas las instancias para que contengan los mismos valores para estos dos campos.
    • generation_timestamp debe ser actual o del pasado reciente (idealmente, la marca de tiempo de la base de datos de lectura del socio)
  4. Después de que se suben todos los fragmentos, Google los agrupa a través de generation_timestamp y nonce.

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

Ejemplo de feed de disponibilidad fragmentado por región

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

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