对 Feed 文件进行分片

可能需要进行分片(或将 Feed 拆分为多个文件),具体取决于您的目录。

何时使用分片

  • 1 个文件的 Feed 超过 200 MB(采用 gzip 压缩后)。

    • 示例:生成的库存状况 Feed 为 1 GB。应该将其分片为 5 个以上单独的文件(或分片)。
  • 合作伙伴库存分布在多个系统和/或地区中,导致难以协调目录。

    • 示例:合作伙伴拥有位于不同系统中的美国和欧盟目录。可以使用相同的 noncegeneration_timestamp 生成 Feed,其中包含 2 个文件(或分片),1 个用于美国,1 个用于欧盟。

一般规则

  • 对于 1 个文件,每个分片不得超过 200 MB(进行 gzip 压缩后)。
  • 我们建议每个 Feed 的分片不要超过 20 个。如果您的业务理由需要超过该金额,请联系支持团队获取进一步说明。
  • 单独的记录(例如,一个 Merchant 对象)必须在一个分片中发送,不能跨多个分片进行拆分。但是,对于将来的 Feed,不必使用相同的 shard_number 在分片中发送它们。
  • 为了获得更好的性能,您的数据应在分片之间平均分配,使所有分片文件的大小相似。

如何将 Feed 分片

对于每个文件(或分片),将 FeedMetadata 设置为以下内容:

  • processing_instruction 设置为 PROCESS_AS_COMPLETE
  • shard_number 设置为 Feed 的当前分片(从 0 开始到 total_shards - 1,没有不连续性)
  • total_shards 设置为 Feed 的分片总数(从 1 开始)。
  • nonce 设置为一个唯一标识符,该标识符在同一 Feed 的所有分片中必须相同,但与其他 Feed 的值不同。
  • generation_timestamp 是采用 unix 和 EPOCH 格式的时间戳。在 Feed 的所有分片中,此值应该相同

建议:为每个文件(或分片)设置文件名,以指示 Feed 类型、时间戳、分片编号和分片总数。分片的大小应该大致相等,并且会在所有分片上传后进行处理。

  • Example: “availability_feed_1574117613_001_of_002.json.gz”

分片可用性 Feed 示例

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

为合作伙伴分发的广告资源使用分片

对合作伙伴来说,将跨多个系统和/或地区分发的商品目录整合到单个 Feed 中可能并非易事。通过将每个分片设置为与每个分布式系统的目录集匹配,可以使用分片来解决协调难题。

例如,假设某个合作伙伴的商品目录被划分到 2 个区域(美国和欧盟商品目录中),它们分别位于 2 个独立的系统中。

合作伙伴可以将每个 Feed 拆分为 2 个文件(或分片):

  • 商家 Feed:1 个分片针对美国,1 个分片针对欧盟
  • 服务 Feed:1 个分片(对于美国)、1 个分片(对于欧盟)
  • 可用性 Feed:1 个分片针对美国,1 个分片针对欧盟

请按照以下步骤操作,确保 Feed 得到正确处理:

  1. 确定上传时间表,并配置每个资产清单实例以遵循该时间表。
  2. 为每个实例分配唯一的分片编号(例如 US = N、EU = N + 1)。 将 total_shards 设置为分片总数。
  3. 在每个预定的上传时间确定 generation_timestampnonce。在 FeedMetadata 中,为所有实例设置这两个字段的相同值。
    • generation_timestamp 应为当前或最近过去的时间(最好是合作伙伴的数据库读取时间戳)
  4. 上传所有分片后,Google 会通过 generation_timestampnonce 对分片进行分组。

即使每个分片代表合作伙伴商品目录中的一个不同区域,Google 也会将 Feed 视为一个区域进行处理,并且可在一天中的不同时间上传(只要所有分片的 generation_timestamp 都相同)。

按区域划分的可用性 Feed 示例

分片 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 - 欧盟广告资源

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