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

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

Повышение пропускной способности

  • Чем меньше крупных заказов, тем предпочтительнее множество мелких.

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

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

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

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

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

AssetGroupListingGroupFilterOperation управляет группами объявлений внутри AssetGroup , что часто встречается в кампаниях Performance Max. 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 . Вы можете определить размер запроса перед отправкой и предпринять соответствующие действия, если он окажется слишком большим.

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

    Руби

    
    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;
    

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