在庫によっては、シャーディング(フィードを複数のファイルに分割すること)が必要になる場合があります。
シャーディングを使用するタイミング
フィードの 1 つのファイルが 200 MB を超えています(gzip 圧縮後)。
- 例: 生成された在庫状況フィードが 1 GB の場合。これは 5 つ以上の個別のファイル(またはシャード)にシャーディングする必要があります。
パートナーの広告枠がシステムや地域に分散しているため、広告枠の調整が困難。
- 例: パートナーは、別々のシステムに存在する米国と EU のインベントリを所有しています。フィードは、同じ
nonceとgeneration_timestampを使用して、米国用と EU 用の 2 つのファイル(またはシャード)で生成できます。
- 例: パートナーは、別々のシステムに存在する米国と EU のインベントリを所有しています。フィードは、同じ
一般規則
- 各シャードのサイズは、1 ファイルあたり 200 MB を超えることはできません(gzip 圧縮後)。
- フィードあたりのシャード数は 20 個以下にすることをおすすめします。この金額を超えるビジネス上の正当な理由がある場合は、サポートにお問い合わせください。
-
個々のレコード(たとえば 1 つの
Merchantオブジェクト)は 1 つのシャードで送信する必要があります。複数のシャードに分割することはできません。ただし、今後のフィードで同じshard_numberのシャードで送信する必要はありません。 - パフォーマンスを向上させるには、シャード間でデータを均等に分割し、シャーディングしたすべてのファイルを同じくらいのサイズにする必要があります。
フィードをシャーディングする方法
ファイル(またはシャード)ごとに、FeedMetadata を次のように設定します。
processing_instructionをPROCESS_AS_COMPLETEに設定します。shard_numberはフィードの現在のシャードに設定されます(0 からtotal_shards- 1 まで、不連続性はありません)。total_shardsは、フィードのシャードの合計数(1 から始まる)に設定されます。nonceは、同じフィードのすべてのシャードで同じ一意の識別子に設定されますが、他のフィードの値とは異なります。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 個のシャード
フィードが正しく処理されるようにするには、以下の手順に沿って操作します。
- アップロード スケジュールを決定し、スケジュールに従うようにインベントリの各インスタンスを構成します。
- インスタンスごとに一意のシャード番号を割り当てます(例: US = N、EU = N + 1)。
total_shardsをシャードの合計数に設定します。 - スケジュールされたアップロード時間ごとに、
generation_timestampとnonceを決定します。FeedMetadataで、これらの 2 つのフィールドに同じ値を保持するようにすべてのインスタンスを設定します。generation_timestampは現在または最近の過去である必要があります(理想的には、パートナーの読み取り時のデータベース タイムスタンプ)。
- すべてのシャードがアップロードされると、Google は
generation_timestampとnonceを使用してシャードをグループ化します。
各シャードはパートナーの在庫の異なる地域を表し、generation_timestamp がすべてのシャードで同じであれば、1 日の異なる時間にアップロードできますが、Google はフィードを 1 つとして処理します。
地域別のシャーディングされた在庫状況フィードの例
Shard 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"
}
]
}
]
}