Fragmentierte Feeddateien (alte Version)

Je nach Inventar kann es notwendig sein, die Feeds zu fragmentieren oder die Feeds in mehrere Dateien aufzuteilen.

Wann sollte die Fragmentierung verwendet werden?

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

    • Beispiel: Der generierte Verfügbarkeitsfeed ist 1 GB groß. Dies sollte in mehr als 5 separate Dateien (oder Shards) aufgeteilt werden.
  • Partnerinventar wird auf Systeme und/oder Regionen verteilt, was zu Schwierigkeiten beim Abgleich des Inventars führt.

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

Allgemeine Regeln

  • Ein Shard darf für eine Datei (nach der gzip-Komprimierung) nicht größer als 200 MB sein.
  • Wir empfehlen nicht mehr als 20 Shards pro Feed. Wenn Sie aus geschäftlichen Gründen einen höheren Betrag benötigen, wenden Sie sich bitte an den Support.
  • Einzelne Datensätze (z. B. ein Merchant-Objekt) müssen in einem Shard gesendet werden. Sie können nicht auf mehrere Shards aufgeteilt werden. Für zukünftige Feeds müssen sie jedoch nicht mit derselben shard_number im Shard gesendet werden.
  • Für eine bessere Leistung sollten die Daten gleichmäßig auf die Shards aufgeteilt werden, damit alle fragmentierten Dateien eine ähnliche Größe haben.

Feeds fragmentieren

Legen Sie für jede Datei (oder jeden Shard) für FeedMetadata Folgendes fest:

  • processing_instructionauf PROCESS_AS_COMPLETE festgelegt.
  • shard_number auf den aktuellen Shard des Feeds festgelegt ist (beginnend von 0 bis total_shards - 1 ohne Unterbrechungen)
  • total_shards ist auf die Gesamtzahl der Shards für den Feed festgelegt (beginnend mit 1).
  • nonce ist auf eine eindeutige Kennung festgelegt, die für alle Shards desselben Feeds gleich ist, sich jedoch vom Wert anderer Feeds unterscheidet.
  • generation_timestamp ist der Zeitstempel im Unix- und EPOCH-Format. Er sollte für alle Shards des Feeds gleich sein.

Empfohlen: Legen Sie für jede Datei (oder jeden Shard) den Dateinamen fest, um den Feedtyp, den Zeitstempel, die Shard-Nummer und die Gesamtzahl der Shards anzugeben. Shards sollten in etwa gleich groß sein und werden verarbeitet, 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 verwenden

Für Partner kann es schwierig sein, Inventar, das auf mehrere Systeme und/oder Regionen verteilt ist, in einem einzigen Feed zusammenzufassen. Sharding kann verwendet werden, um Probleme beim Abgleich zu lösen, indem jeder Shard so festgelegt wird, dass es dem Inventarsatz jedes verteilten Systems entspricht.

Beispiel: Das Inventar eines Partners ist in zwei Regionen (Inventar für die USA und die EU) aufgeteilt, die wiederum in zwei separaten Systemen vorhanden sind.

Der Partner kann jeden Feed in zwei Dateien (oder Shards) 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

So sorgen Sie dafür, dass die Feeds richtig verarbeitet werden:

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

Google verarbeitet den Feed, obwohl jeder Shard eine andere Region des Partnerinventars darstellt und zu einer anderen Tageszeit hochgeladen werden kann, solange die generation_timestamp in allen Shards gleich ist.

Beispiel für einen fragmentierten Verfügbarkeitsfeed 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"
        }
      ]
    }
  ]
}