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

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

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

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

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

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

Атомарность при разделении партии

API Google Ads может разбить операции в отправленном пакетном задании на более мелкие подпакеты для обработки. Если вы не группируете связанные операции, например, перечисление изменений групп в AssetGroup и AdGroup последовательно в рамках одного пакетного задания, API Google Ads может разбить эти операции на отдельные подпакеты. Такое разделение может привести либо к сбою всего изменения, либо к нестабильности состояния аккаунта.

Логическая группировка

AssetGroupListingGroupFilterOperation управляет группами объявлений внутри AssetGroup , что часто встречается в кампаниях с максимальной эффективностью. AdGroupCriterionOperation управляет группами объявлений внутри AdGroup , что часто встречается в стандартных торговых кампаниях. Оба они используются для определения таргетинга товаров. Если вы вносите изменения, влияющие на иерархию таргетинга товаров в обоих контекстах, сгруппируйте эти операции последовательно в пакетном задании, чтобы гарантировать их совместное применение.

Согласованность данных

Чтобы поддерживать согласованность данных и предотвращать частичные обновления, последовательно добавляйте связанные операции по группировке листингов в пакетное задание. Такой порядок позволяет группировать их в атомарные подпакеты с помощью логики разделения пакетов API, что предотвращает несогласованность данных в вашем аккаунте.

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

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

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

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

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

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

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

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

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

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

Ограничения

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

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

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

  • Начиная с версии 22 каждый запрос AddBatchJobOperations имеет ограничение в 10 000 операций мутации на запрос.

  • Начиная с версии 22, для поля page_size в ListBatchJobResultsRequest :

    • Если page_size не задан или равен 0, по умолчанию используется максимальное значение 1000.
    • Если page_size превышает 1000 или меньше 0, API возвращает ошибку INVALID_PAGE_SIZE .
  • Максимальный размер каждого запроса 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);