Feeddateien fragmentieren (alte Version)

Je nach Inventar kann es erforderlich sein, Feeds in mehrere Dateien aufzuteilen.

Wann sollte Sharding verwendet werden?

  • Der Feed ist für eine Datei (nach der GZIP-Komprimierung) größer als 200 MB.

    • Beispiel:Der generierte Verfügbarkeitsfeed hat eine Größe von 1 GB. Die Datei sollte in mindestens fünf separate Dateien (oder Shards) aufgeteilt werden.
  • Partnerinventar ist auf Systeme und/oder Regionen verteilt, was die Abstimmung des Inventars erschwert.

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

Allgemeine Regeln

  • Jeder Shard darf für eine Datei (nach der Gzip-Komprimierung) maximal 200 MB groß sein.
  • Wir empfehlen, nicht mehr als 20 Shards pro Feed zu verwenden. Wenn Sie aus geschäftlichen Gründen mehr als diesen 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 im Shard mit demselben shard_number gesendet werden.
  • Für eine bessere Leistung sollten Ihre Daten gleichmäßig auf die Shards aufgeteilt werden, sodass alle fragmentierten Dateien eine ähnliche Größe haben.

Feeds fragmentieren

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

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

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

  • Example: “availability_feed_1574117613_001_of_002.json.gz”

Beispiel für einen Verfügbarkeitsfeed mit Sharding

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

Sharding für von Partnern bereitgestelltes Inventar verwenden

Es kann für Partner schwierig sein, Inventar, das auf mehrere Systeme und/oder Regionen verteilt ist, in einem einzigen Feed zusammenzufassen. Mit Sharding lassen sich Abstimmungsprobleme beheben, indem jeder Shard auf das Inventarset des jeweiligen verteilten Systems abgestimmt wird.

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

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

Gehen Sie die folgenden Schritte durch, um sicherzustellen, dass die Feeds richtig verarbeitet werden:

  1. Legen Sie einen Upload-Zeitplan fest und konfigurieren Sie jede Inventarinstanz so, dass sie diesem Zeitplan folgt.
  2. Weisen Sie jeder Instanz eindeutige Shard-Nummern zu (z.B. US = N, EU = N + 1). Legen Sie total_shards auf die Gesamtzahl der Shards fest.
  3. Legen Sie für jeden geplanten Uploadzeitpunkt ein generation_timestamp und ein nonce fest. Legen Sie in der FeedMetadata für alle Instanzen dieselben Werte für diese beiden Felder fest.
    • generation_timestamp sollte das aktuelle Datum oder ein Datum in der jüngsten Vergangenheit sein (idealerweise der Zeitstempel der Datenbank des Partners).
  4. Nachdem alle Shards hochgeladen wurden, gruppiert Google sie über generation_timestamp und nonce.

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

Beispiel für einen nach Region aufgeteilten Verfügbarkeitsfeed

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