Prácticas recomendadas y limitaciones

Ten en cuenta estos lineamientos cuando uses BatchJobService.

Mejora la capacidad de procesamiento

  • Se prefieren menos trabajos más grandes que muchos trabajos más pequeños.

  • Ordena las operaciones subidas por tipo de operación. Por ejemplo, si tu trabajo contiene operaciones para agregar campañas, grupos de anuncios y criterios del grupo de anuncios, ordena las operaciones en tu carga de modo que todas las operaciones de campaña se realicen primero, seguidas de todas las operaciones de grupo de anuncios y, por último, todas las operaciones de criterios del grupo de anuncios.

  • En las operaciones del mismo tipo, puede mejorar el rendimiento agruparlas por recurso principal. Por ejemplo, si tienes una serie de objetos AdGroupCriterionOperation, puede ser más eficiente agrupar las operaciones por grupo de anuncios, en lugar de mezclar operaciones que afectan los criterios de grupos de anuncios en diferentes grupos de anuncios.

Atomicidad en la división por lotes

Es posible que la API de Google Ads divida las operaciones de un trabajo por lotes enviado en sub-lotes más pequeños para su procesamiento. Si no agrupas las operaciones relacionadas, como las modificaciones de grupos de fichas dentro de un AssetGroup y un AdGroup, de forma consecutiva dentro de un trabajo por lotes, es posible que la API de Google Ads divida estas operaciones en diferentes sub-lotes. Esta separación puede provocar que falle toda la modificación o que la cuenta quede en un estado incoherente.

Agrupación lógica

AssetGroupListingGroupFilterOperation administra grupos de fichas dentro de un AssetGroup, lo que es común en las campañas de máximo rendimiento. AdGroupCriterionOperation administra grupos de fichas dentro de un AdGroup, lo que es común en las campañas de Shopping estándares. Ambos se usan para definir la segmentación de productos. Si realizas cambios que afectan la jerarquía de segmentación de productos en ambos contextos, agrupa estas operaciones de forma consecutiva en tu trabajo por lotes para asegurarte de que se apliquen juntas.

Coherencia de los datos

Para mantener la coherencia de los datos y evitar actualizaciones parciales, agrega operaciones relacionadas con grupos de fichas de forma consecutiva a tu trabajo por lotes. Este ordenamiento ayuda a agruparlos en sublotes atómicos según la lógica de división de lotes de la API, lo que evita que tu cuenta quede en un estado incoherente.

Evita problemas de simultaneidad

  • Cuando envíes varios trabajos simultáneos para la misma cuenta, intenta reducir la probabilidad de que los trabajos operen en los mismos objetos al mismo tiempo, sin dejar de mantener tamaños de trabajo grandes. Muchos trabajos sin terminar, que tienen el estado RUNNING, intentan mutar el mismo conjunto de objetos, lo que puede generar condiciones similares a un bloqueo que provocan una ralentización grave e incluso fallas en los trabajos.

  • No envíes varias operaciones que modifiquen el mismo objeto en el mismo trabajo, ya que el resultado puede ser impredecible.

Recupera resultados de forma óptima

  • No sondee el estado del trabajo con demasiada frecuencia, ya que corre el riesgo de alcanzar errores de límite de frecuencia.

  • No recuperes más de 1,000 resultados por página. El servidor podría devolver menos resultados debido a la carga o a otros factores.

  • El orden de los resultados será el mismo que el orden de carga.

Orientación adicional sobre el uso

  • Puedes establecer un límite superior para el tiempo que se permite que se ejecute un trabajo por lotes antes de que se cancele. Cuando crees un trabajo por lotes nuevo, configura el campo metadata.execution_limit_seconds en el límite de tiempo que prefieras, en segundos. No hay un límite de tiempo predeterminado si no se establece metadata.execution_limit_seconds.

  • Se recomienda agregar no más de 1,000 operaciones por AddBatchJobOperationsRequest y usar sequence_token para subir el resto de las operaciones al mismo trabajo. Según el contenido de las operaciones, demasiadas operaciones en un solo AddBatchJobOperationsRequest podrían causar un error REQUEST_TOO_LARGE. Para controlar este error, reduce la cantidad de operaciones y vuelve a intentar la llamada a AddBatchJobOperationsRequest.

Limitaciones

  • Cada BatchJob admite hasta un millón de operaciones.

  • Cada cuenta puede tener hasta 100 trabajos activos o pendientes al mismo tiempo.

  • Los trabajos pendientes que tengan más de 7 días se quitarán automáticamente.

  • A partir de la versión 22, cada solicitud de AddBatchJobOperations tiene un límite de 10,000 operaciones de mutación por solicitud.

  • A partir de la versión 22, para el campo page_size en ListBatchJobResultsRequest, se aplica lo siguiente:

    • Si page_size no se establece o es 0, se establece de forma predeterminada en el máximo de 1,000.
    • Si page_size supera los 1,000 o es inferior a 0, la API devuelve un error de INVALID_PAGE_SIZE.
  • Cada AddBatchJobOperationsRequest tiene un tamaño máximo de 10,484,504 bytes. Si lo superas, recibirás un INTERNAL_ERROR. Puedes determinar el tamaño de la solicitud antes de enviarla y tomar las medidas adecuadas si es demasiado grande.

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

    Rita

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