Dzielenie plików kanału

W zależności od asortymentu może być konieczne podzielenie plików danych na kilka plików.

Kiedy używać podziału na fragmenty

  • Plik danych przekracza 200 MB (po skompresowaniu gzipem).

    • Przykład: wygenerowany plik danych o dostępności ma rozmiar 1 GB. Powinien być podzielony na co najmniej 5 oddzielnych plików (lub fragmentów).
  • Zasoby reklamowe partnera są rozproszone w różnych systemach lub regionach, co utrudnia ich uzgadnianie.

    • Przykład: partner ma zasoby reklamowe w Stanach Zjednoczonych i Unii Europejskiej, które znajdują się w różnych systemach. Plik danych może być wygenerowany z 2 plikami (lub fragmentami), 1 dla USA i 1 dla UE z tymi samymi wartościami noncegeneration_timestamp.

Ogólne zasady

  • Każdy fragment nie może przekraczać 200 MB na 1 plik (po kompresji gzip).
  • Zalecamy stosowanie nie więcej niż 20 fragmentów na kanał. Jeśli masz uzasadnienie biznesowe, które wymaga większej kwoty, skontaktuj się z zespołem pomocy, aby uzyskać dalsze instrukcje.
  • Poszczególne rekordy (np. jeden obiekt Merchant) muszą być wysyłane w ramach jednego fragmentu. Nie można ich dzielić na kilka fragmentów. Nie muszą jednak być wysyłane w ramach fragmentu z tym samym shard_number w przypadku kolejnych plików danych.
  • Aby uzyskać lepszą wydajność, dane powinny być podzielone równomiernie na fragmenty, tak aby wszystkie podzielone pliki były podobne pod względem rozmiaru.

Jak dzielić pliki danych

W przypadku każdego pliku (lub fragmentu) ustaw wartość parametru FeedMetadata na:

  • processing_instruction ustawiono na PROCESS_AS_COMPLETE.
  • shard_number ustawiony na bieżący fragment pliku danych (od 0 do total_shards - 1 bez przerw)
  • total_shards ustaw na łączną liczbę fragmentów w źródle danych (zaczynając od 1).
  • nonce ustawiony na unikalny identyfikator, który jest taki sam dla wszystkich fragmentów tego samego pliku danych, ale różni się od wartości innych plików danych. nonce musi być dodatnią liczbą całkowitą (uint64).
  • generation_timestamp to sygnatura czasowa w formacie Unix i EPOCH. Powinien być taki sam we wszystkich częściach pliku danych.

Zalecane: w przypadku każdego pliku (lub fragmentu) ustaw nazwę pliku tak, aby wskazywała typ pliku danych, sygnaturę czasową, numer fragmentu i łączną liczbę fragmentów. Fragmenty powinny być mniej więcej tej samej wielkości i przetwarzane po przesłaniu wszystkich fragmentów.

  • Example: “availability_feed_1574117613_001_of_002.json.gz”

Przykład pliku danych z dostępnością w wielu częściach

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

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

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

Używanie podziału na segmenty w przypadku zasobów reklamowych rozproszonych między partnerów

Partnerzy mogą mieć problemy ze skonsolidowaniem zasobów reklamowych rozproszonych w wielu systemach lub regionach w jednym pliku danych. Podział na fragmenty może być używany do rozwiązywania problemów z zgodnością przez dopasowywanie każdego fragmentu do każdego zbioru zasobów reklamowych rozproszonego systemu.

Załóżmy na przykład, że zasoby reklamowe partnera są podzielone na 2 regiony (zasoby reklamowe w USA i w UE), które znajdują się w 2 oddzielnych systemach.

Partner może podzielić każdy plik danych na 2 pliki (lub fragmenty):

  • Plik danych sprzedawcy: 1 część dla Stanów Zjednoczonych, 1 część dla UE
  • Plik danych usług: 1 fragment dla Stanów Zjednoczonych, 1 fragment dla UE
  • Plik danych o dostępności: 1 część dla Stanów Zjednoczonych, 1 część dla UE

Aby mieć pewność, że pliki danych są prawidłowo przetwarzane:

  1. Określ harmonogram przesyłania i skonfiguruj każdą instancję zasobu reklamowego, aby przestrzegała harmonogramu.
  2. Przypisz unikalne numery fragmentów do każdej instancji (np. US = N, EU = N + 1). Ustaw wartość parametru total_shards na łączną liczbę fragmentów.
  3. W przypadku każdego zaplanowanego przesyłania zdecyduj, jakie będą wartości parametrów generation_timestampnonce. W sekcji FeedMetadata ustaw wszystkie wystąpienia tak, aby zawierały te same wartości w tych 2 polach.
    • generation_timestamp powinna być bieżąca lub z niedawnej przeszłości (najlepiej odpowiadająca sygnaturze czasu odczytu w bazie danych partnera).
  4. Po przesłaniu wszystkich fragmentów Google grupował je za pomocą funkcji generation_timestamp i nonce.

Google przetworzy plik danych jako jeden, mimo że każdy fragment reprezentuje inny region asortymentu partnera i może zostać przesłany o innej porze dnia, o ile generation_timestamp jest taki sam we wszystkich fragmentach.

Przykład pliku danych z podziałem na regiony

Ułamek 0 – zasoby reklamowe w Stanach Zjednoczonych

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

Ułamek 1 – zasoby reklamowe w 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"
        }
      ]
    }
  ]
}