最佳实践和限制

使用 BatchJobService 时,请遵循以下准则。

提高吞吐量

  • 与大量较小的作业相比,较少的作业更容易被接受。

  • 按操作类型对上传的操作进行排序。例如,如果您的作业包含添加广告系列、广告组和广告组条件的操作,请对上传文件中的操作进行排序,使所有广告系列操作排在最前面,接着是所有广告组操作,最后是所有广告组条件操作

  • 在同类操作中,按父资源对它们进行分组可以提高性能。例如,如果您有一系列 AdGroupCriterionOperation 对象,那么按广告组对操作进行分组会比将影响不同广告组中广告组条件的操作混合使用更高效。

避免并发问题

  • 在为同一帐号提交多个并发作业时,请尽量降低针对相同对象同时执行多项作业的可能性,同时保持大型作业的规模。如果对同一组对象执行 mutate 操作的未完成作业(状态为 RUNNING)过多,可能会出现死锁的情况,导致系统速度严重降低,甚至造成作业失败。

  • 请勿在同一作业中提交对同一对象执行 mutate 操作的多个操作,因为结果可能无法预测。

以最佳方式检索结果

  • 请勿过于频繁地轮询作业状态,否则可能会发生速率限制错误。

  • 每页检索的结果不得超过 1,000 条。由于负载或其他因素,服务器返回的内容数量可能会少于该值。

  • 结果顺序与上传顺序相同。

其他使用指南

  • 您可以设置一个上限,指定批量作业在被取消之前可以运行的时长。创建新的批量作业时,请将 metadata.execution_limit_seconds 字段设置为您的首选时间限制(以秒为单位)。如果未设置 metadata.execution_limit_seconds,则没有默认的时间限制。

  • 建议每个 AddBatchJobOperationsRequest 添加的操作不超过 1,000 个,并使用 sequence_token 将其余操作上传到同一作业。根据操作的内容,单个 AddBatchJobOperationsRequest 中执行过多的操作可能会导致 REQUEST_TOO_LARGE 错误。您可以通过减少操作次数并重试 AddBatchJobOperationsRequest 来处理此错误。

限制

  • 每个 BatchJob 最多支持一百万次操作。

  • 每个帐号可同时拥有最多 100 个活跃或待处理作业。

  • 系统会自动移除存在时长超过 7 天的待处理作业。

  • 每个 AddBatchJobOperationsRequest 的大小上限为 10,484,504 字节。如果超过此上限,您将收到 INTERNAL_ERROR。您可以在提交之前确定请求的大小,并在请求过大时采取相应措施。

    Java

    
    static final int MAX_REQUEST_BYTES = 10_484_504;
    
    ... (code to get the request object)
    
    int sizeInBytes = request.getSerializedSize();
    

    Python

    
    from google.ads.googleads.client import GoogleAdsClient
    
    MAX_REQUEST_BYTES = 10484504
    
    ... (code to get the request object)
    
    size_in_bytes = request._pb.ByteSize()
    

    Ruby

    
    require 'google/ads/google_ads'
    
    MAX_REQUEST_BYTES = 10484504
    
    ... (code to get the request object)
    
    size_in_bytes = request.to_proto.bytesize
    

    PHP

    
    use Google\Ads\GoogleAds\V16\Resources\Campaign;
    
    const MAX_REQUEST_BYTES = 10484504;
    
    ... (code to get the request object)
    
    $size_in_bytes = $campaign->byteSize() . PHP_EOL;
    

    .NET

    
    using Google.Protobuf;
    const int MAX_REQUEST_BYTES = 10484504;
    
    ... (code to get the request object)
    
    int sizeInBytes = request.ToByteArray().Length;
    

    Perl

    
    use Devel::Size qw(total_size);
    use constant MAX_REQUEST_BYTES => 10484504;
    
    ... (code to get the request object)
    
    my $size_in_bytes = total_size($request);