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

При использовании 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);