フィード ファイルのシャーディング

在庫によっては、シャーディング(フィードを複数のファイルに分割)が必要になる場合があります。

シャーディングを使用する場合

  • 1 つのファイルでフィードが 200 MB を超える(gzip 圧縮後)。

    • 例: 生成された可用性フィードは 1 GB です。これは、5 つ以上の個別のファイル(またはシャード)にシャーディングする必要があります。
  • パートナーの広告枠がシステムやリージョンに分散しているため、広告枠の調整が困難です。

    • 例: パートナーが米国と EU の広告枠を別々のシステムに保持している場合。フィードは、2 つのファイル(またはシャード)で生成できます。1 つは米国用、もう 1 つは EU 用で、同じ noncegeneration_timestamp を使用します。

一般規則

  • 各シャードのサイズは、1 ファイルあたり 200 MB(gzip 圧縮後)を超えてはなりません。
  • フィードあたりのシャード数は 20 個以下にすることをおすすめします。この金額を超える費用が必要なビジネス上の理由がある場合は、サポートにお問い合わせのうえ、詳細な手順をご確認ください。
  • 個々のレコード(1 つの Merchant オブジェクトなど)は 1 つのシャードで送信する必要があります。複数のシャードに分割することはできません。ただし、今後のフィードの同じ shard_number を持つシャードで送信する必要はありません。
  • パフォーマンスを向上させるには、シャード間でデータを均等に分割し、シャーディングしたすべてのファイルを同じくらいのサイズにする必要があります。

フィードをシャーディングする方法

ファイル(またはシャード)ごとに、FeedMetadata を次のように設定します。

  • processing_instructionPROCESS_AS_COMPLETE に設定します。
  • shard_number は、フィードの現在のシャードに設定します(0 から total_shards-1 まで、連続性なし)。
  • total_shards は、フィードのシャードの合計数(1 から開始)に設定します。
  • nonce は、同じフィード内のすべてのシャードで一意の識別子に設定します。ただし、他のフィードとは異なる値にします。nonce は正の整数(uint64)にする必要があります。
  • generation_timestamp は、Unix 形式と EPOCH 形式のタイムスタンプです。これは、フィードのすべてのシャードで同じにする必要があります。

推奨: ファイル(またはシャード)ごとに、ファイル名を設定して、フィードタイプ、タイムスタンプ、シャード番号、シャードの合計数を指定します。シャードのサイズはほぼ同じである必要があります。シャードは、すべてのシャードがアップロードされると処理されます。

  • Example: “availability_feed_1574117613_001_of_002.json.gz”

シャーディングされた空き情報フィードの例

シャード 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"
        }
      ]
    }
  ]
}

シャード 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"
        }
      ]
    }
  ]
}

シャード 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"
        }
      ]
    }
  ]
}

パートナーが提供する広告枠にシャーディングを使用する

複数のシステムやリージョンに分散された広告枠を 1 つのフィードに統合することは、パートナーにとって難しい場合があります。シャーディングを使用すると、各分散システムのインベントリセットと一致するように各シャードを設定することで、調整の問題を解決できます。

たとえば、パートナーの広告枠が 2 つのリージョン(米国と EU の広告枠)に分かれており、それぞれが 2 つのシステムに存在するとします。

パートナーは、各フィードを 2 つのファイル(シャード)に分割できます。

  • 販売者フィード: 米国用 1 個のシャード、EU 用 1 個のシャード
  • サービス フィード: 米国用に 1 個のシャード、EU 用に 1 個のシャード
  • 空き状況フィード: 米国 1 シャード、EU 1 シャード

フィードが正しく処理されていることを確認する手順は次のとおりです。

  1. アップロード スケジュールを決定し、スケジュールに従うようにインベントリの各インスタンスを構成します。
  2. 各インスタンスに固有のシャード番号を割り当てます(例: US = N、EU = N + 1)。total_shards をシャードの合計数に設定します。
  3. スケジュール設定されたアップロード時間ごとに、generation_timestampnonce を決定します。FeedMetadata で、これらの 2 つのフィールドに同じ値を保持するようにすべてのインスタンスを設定します。
    • generation_timestamp は現在の日付または最近の日付にする必要があります(理想的には、パートナーのデータベースの読み取りタイムスタンプ)。
  4. すべてのシャードがアップロードされると、Google は generation_timestampnonce を使用してシャードをグループ化します。

各シャードはパートナーの広告枠の異なる地域を表していても、generation_timestamp がすべてのシャードで同じであれば、Google はフィードを 1 つとして処理します。また、シャードごとにアップロードする時間帯が異なっていてもかまいません。

リージョン別のシャーディングされたアベイラビリティ フィードの例

シャード 0 - 米国の広告枠

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

シャード 1 - EU 広告枠

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