使用
BatchJobService时,请考虑以下准则。
提高吞吐量
最好使用较少的较大作业,而不是使用较多的较小作业。
按操作类型对上传的操作进行排序。例如,如果您的作业 包含用于添加广告系列、广告组和广告组条件的操作, 请在上传时对操作进行排序,以便所有 广告系列 操作 都排在最前面,然后是所有 的 广告组操作,最后是所有 广告组条件操作。
在同一类型的操作中,按父资源对操作进行分组可以提高性能。例如,如果您有一系列
AdGroupCriterionOperation对象,按广告组对操作进行分组会更高效,而不是将影响不同广告组中的广告组条件的操作混在一起。
批量拆分中的原子性
Google Ads API 可能会将提交的批量作业中的操作拆分为较小的子批次进行处理。如果您未在批量作业中连续对相关操作(例如
AssetGroup和AdGroup中的产品信息组修改)进行分组,
Google Ads API 可能会将这些操作拆分为不同的子批次。这种拆分可能会导致整个修改失败,或者使账号处于不一致的状态。
逻辑分组
AssetGroupListingGroupFilterOperation
用于管理 AssetGroup 中的产品信息组,这
在效果最大化广告系列中很常见。
AdGroupCriterionOperation 用于管理
AdGroup 中的产品信息组,这在
标准购物广告系列中很常见。两者都用于定义产品定位。如果您所做的更改会影响这两个上下文中的商品定位层次结构,请在批量作业中连续对这些操作进行分组,以确保它们一起应用。
数据一致性
为了保持数据一致性并防止部分更新,请将相关产品信息组操作连续添加到批量作业中。这种排序方式有助于 API 的批量拆分逻辑将它们分组到原子子批次中,从而防止您的账号处于不一致的状态。
避免并发问题
为同一账号提交多个并发作业时,请尽量减少作业同时对同一对象进行操作的可能性,同时保持较大的作业大小。许多状态为
RUNNING的未完成作业 尝试对同一组对象进行 mutate 操作,这可能会导致类似死锁的 情况,从而导致严重的速度减慢,甚至作业失败。请勿在同一作业中提交多个对同一对象进行 mutate 操作的操作,因为结果可能无法预测。
以最佳方式检索结果
请勿过于频繁地轮询作业状态,否则可能会遇到速率限制错误。
请勿每页检索超过 1,000 个结果。由于负载或其他因素,服务器可能会返回少于此数量的结果。
结果顺序将与上传顺序相同。
其他使用指南
您可以设置批量作业在被取消之前允许运行的时长上限。创建新的批量作业时,请将
metadata.execution_limit_seconds字段设置为您首选的时间限制(以秒为单位)。如果未设置metadata.execution_limit_seconds,则没有默认时间限制。建议每个
AddBatchJobOperationsRequest添加的操作不超过 1,000 个,并使用sequence_token将其余操作上传到同一作业。根据操作的内容,单个AddBatchJobOperationsRequest中的操作过多可能会导致REQUEST_TOO_LARGE错误。您可以通过减少操作数量并重试AddBatchJobOperationsRequest来处理此错误。
限制
每个
BatchJob最多支持 100 万个 操作。每个账号最多可以同时有 100 个处于活动状态或待处理状态的作业。
系统会自动移除超过 7 天的待处理作业。
自 v22 起,每个
AddBatchJobOperations请求的 mutate 操作数量上限为 10,000 个。自 v22 起,对于
page_size字段在ListBatchJobResultsRequest:- 如果未设置
page_size或将其设置为 0,则默认值为 1,000(上限)。 - 如果
page_size超过 1,000 或小于 0,API 会返回INVALID_PAGE_SIZE错误。
- 如果未设置
自 v23 起,每个
AddBatchJobOperationsRequest的大小上限为 41,937,920 字节。如果超出此上限,您将收到 anINTERNAL_ERROR。 您可以在提交请求之前确定请求的大小,并在请求过大时采取适当措施。Java
static final int MAX_REQUEST_BYTES = 41_937_920; ... (code to get the request object) int sizeInBytes = request.getSerializedSize();Python
from google.ads.googleads.client import GoogleAdsClient MAX_REQUEST_BYTES = 41937920 ... (code to get the request object) size_in_bytes = request._pb.ByteSize()Ruby
require 'google/ads/google_ads' MAX_REQUEST_BYTES = 41937920 ... (code to get the request object) size_in_bytes = request.to_proto.bytesizePHP
use Google\Ads\GoogleAds\V16\Resources\Campaign; const MAX_REQUEST_BYTES = 41937920; ... (code to get the request object) $size_in_bytes = $campaign->byteSize() . PHP_EOL;.NET
using Google.Protobuf; const int MAX_REQUEST_BYTES = 41937920; ... (code to get the request object) int sizeInBytes = request.ToByteArray().Length;Perl
use Devel::Size qw(total_size); use constant MAX_REQUEST_BYTES => 41937920; ... (code to get the request object) my $size_in_bytes = total_size($request);
单个 mutate 操作的大小
虽然整体请求可以更大,但批次中单个 mutate 操作的大小上限为 10,484,488 字节(约 10.48 MB)。