Лучшие практики и ограничения

При использовании BatchJobService учитывайте следующие рекомендации.

Улучшить пропускную способность

  • Предпочтительнее выполнять меньше крупных работ, чем много мелких.

  • Упорядочьте загруженные операции по типу операции. Например, если ваша работа содержит операции по добавлению кампаний, групп объявлений и критериев групп объявлений, упорядочите операции в вашей загрузке так, чтобы все операции кампаний были первыми, за ними следовали все операции групп объявлений , а затем все операции критериев групп объявлений .

  • В операциях одного типа можно повысить производительность, сгруппировав их по родительскому ресурсу. Например, если у вас есть ряд объектов AdGroupCriterionOperation , может быть эффективнее сгруппировать операции по группе объявлений, чем смешивать операции, которые влияют на критерии группы объявлений в разных группах объявлений.

Избегайте проблем с параллелизмом

  • При отправке нескольких параллельных заданий для одной учетной записи постарайтесь снизить вероятность одновременной работы заданий над одними и теми же объектами, сохраняя при этом большие размеры заданий. Многие незавершенные задания, имеющие статус RUNNING , пытаются мутировать один и тот же набор объектов, что может привести к условиям, подобным взаимоблокировке, что приведет к серьезному замедлению и даже сбоям заданий.

  • Не отправляйте несколько операций, изменяющих один и тот же объект, в одно и то же задание, так как результат может быть непредсказуемым.

Оптимально получать результаты

  • Не опрашивайте статус задания слишком часто, иначе вы рискуете столкнуться с ошибками, превышающими лимит.

  • Не извлекайте более 1000 результатов на страницу. Сервер может вернуть меньше из-за нагрузки или других факторов.

  • Порядок результатов будет таким же, как и порядок загрузки.

Дополнительные рекомендации по использованию

  • Вы можете установить верхнюю границу того, как долго пакетное задание может выполняться до отмены. При создании нового пакетного задания установите поле metadata.execution_limit_seconds на предпочитаемый вами предел времени в секундах. Если metadata.execution_limit_seconds не установлен, предела времени по умолчанию нет.

  • Рекомендуется добавлять не более 1000 операций на AddBatchJobOperationsRequest и использовать sequence_token для загрузки остальных операций в то же задание. В зависимости от содержимого операций, слишком много операций в одном AddBatchJobOperationsRequest может вызвать ошибку REQUEST_TOO_LARGE . Эту ошибку можно устранить, уменьшив количество операций и повторив AddBatchJobOperationsRequest .

Ограничения

  • Каждый BatchJob поддерживает до миллиона операций.

  • Каждая учетная запись может иметь до 100 активных или ожидающих выполнения заданий одновременно.

  • Ожидающие задания старше 7 дней автоматически удаляются.

  • Каждый AddBatchJobOperationsRequest имеет максимальный размер 10 484 504 байт. Если вы превысите это, вы получите INTERNAL_ERROR . Вы можете определить размер запроса перед отправкой и предпринять соответствующие действия, если он слишком велик.

    Ява

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

    Питон

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

    Рубин

    
    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;
    

    .СЕТЬ

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

    Перл

    
    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);