Feeddateien fragmentieren

Je nach Inventar ist möglicherweise eine Fragmentierung oder das Aufteilen von Feeds in mehrere Dateien erforderlich.

Wann wird die Fragmentierung verwendet?

  • Der Feed überschreitet nach der gzip-Komprimierung 200 MB für 1 Datei.

    • Beispiel: Der generierte Verfügbarkeitsfeed beträgt 1 GB. Dies sollte in mehr als fünf separate Dateien (oder Fragmente) fragmentiert werden.
  • Partnerinventar wird auf Systeme und/oder Regionen verteilt, was zu Schwierigkeiten beim Inventarabgleich führt.

    • Beispiel:Der Partner hat Inventar in den USA und der EU, das sich in separaten Systemen befindet. Der Feed kann mit 2 Dateien (oder Shards), 1 für die USA und 1 für EU mit denselben nonce und generation_timestamp erstellt werden.

Allgemeine Regeln

  • Ein Shard kann für eine Datei nach der GZIP-Komprimierung 200 MB nicht überschreiten.
  • Wir empfehlen, nicht mehr als 20 Fragmente pro Feed zu erstellen. Wenn es eine geschäftliche Begründung gibt, die mehr als diesen Betrag erfordert, wenden Sie sich bitte an den Support.
  • Einzelne Datensätze (z. B. ein Merchant-Objekt) müssen in einen Shard gesendet werden, da sie nicht auf mehrere Shards aufgeteilt werden können. Sie müssen jedoch für zukünftige Feeds nicht im Shard mit demselben shard_number gesendet werden.
  • Für eine bessere Leistung sollten die Daten gleichmäßig auf die Shards aufgeteilt werden, sodass alle Fragmente eine ähnliche Größe haben.

Feeds fragmentieren

Setze FeedMetadata für jede Datei (oder Fragmentierung) auf Folgendes:

  • processing_instructionauf PROCESS_AS_COMPLETE gesetzt.
  • shard_number ist auf den aktuellen Shard des Feeds festgelegt (beginnt von 0 bis total_shards - 1 ohne Diskontinuitäten)
  • total_shards ist auf die Gesamtzahl der Shards für den Feed festgelegt (beginnend mit 1).
  • nonce ist eine eindeutige Kennung, die für alle Fragmente desselben Feeds identisch ist, aber vom Wert anderer Feeds abweicht.
  • generation_timestamp ist der Zeitstempel im Unix- und EPOCH-Format. Er sollte für alle Fragmente des Feeds identisch sein.

Empfohlen: Legen Sie für jede Datei (oder Shard) den Dateinamen fest, um den Feedtyp, den Zeitstempel, die Shard-Nummer und die Gesamtzahl der Shards anzugeben. Shards sollten ungefähr gleich groß sein und verarbeitet werden, sobald alle Shards hochgeladen sind.

  • Example: „availability_feed_1574117613_001_of_002.json.gz“

Beispiel für einen fragmentierten Verfügbarkeitsfeed

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

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

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

Fragmentierung für verteiltes Inventar von Partnern

Es kann für Partner schwierig sein, das über mehrere Systeme und Regionen verteilte Inventar in einem Feed zu konsolidieren. Die Fragmentierung kann genutzt werden, um Probleme beim Abgleich zu lösen. Dazu wird jeder Shard so festgelegt, dass er mit dem Inventarsatz jedes verteilten Systems übereinstimmt.

Angenommen, das Inventar eines Partners ist in zwei Regionen (Inventar in den USA und in der EU) unterteilt, die sich in zwei separaten Systemen befinden.

Der Partner kann jeden Feed in zwei Dateien (oder Fragmente) aufteilen:

  • Händlerfeed: 1 Shard für die USA, 1 Shard für die EU
  • Dienstleistungsfeed: 1 Shard für die USA, 1 Shard für die EU
  • Verfügbarkeitsfeed: 1 Shard für die USA, 1 Shard für die EU

Führen Sie die folgenden Schritte aus, damit die Feeds korrekt verarbeitet werden:

  1. Legen Sie einen Uploadzeitplan fest und konfigurieren Sie jede Inventarinstanz so, dass sie dem Zeitplan entspricht.
  2. Weisen Sie jeder Instanz eindeutige Shard-Nummern zu (z.B. US = N, EU = N + 1). Setzen Sie total_shards auf die Gesamtzahl der Shards.
  3. Legen Sie bei jedem geplanten Upload einen generation_timestamp und einen nonce fest. Legen Sie in FeedMetadata alle Instanzen fest, die dieselben Werte für diese beiden Felder enthalten.
    • generation_timestamp muss aktuell oder jünger als die Vergangenheit sein (idealerweise der Zeitstempel der Lesedatenbank des Partners)
  4. Nachdem alle Shards hochgeladen wurden, gruppiert Google die Shards über generation_timestamp und nonce.

Google verarbeitet den Feed als einen Feed, obwohl jeder Shard eine andere Region des Partnerinventars darstellt und zu einer anderen Tageszeit hochgeladen werden kann, sofern generation_timestamp für alle Shards gleich ist.

Beispiel für Fragmentierung des Verfügbarkeitsfeeds nach Region

Shard 0 – US-Inventar

{
  "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 – EU-Inventar

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