Tenez compte de ces consignes lorsque vous utilisez BatchJobService.
Améliorer le débit
Il est préférable d'avoir moins de jobs plus volumineux que de nombreux jobs plus petits.
Classez les opérations importées par type d'opération (à l'exception des opérations interdépendantes qui doivent être regroupées consécutivement dans des sous-lots atomiques). Par exemple, si votre job contient des opérations pour ajouter des campagnes standards, des groupes d'annonces et des critères de groupe d'annonces, ordonnez les opérations dans votre importation de sorte que toutes les opérations de campagne soient placées en premier, suivies de toutes les opérations de groupe d'annonces, puis de toutes les opérations de critères de groupe d'annonces.
Pour les opérations du même type, vous pouvez améliorer les performances en les regroupant par ressource parente. Par exemple, si vous disposez d'une série d'objets
AdGroupCriterionOperation, il est plus efficace de regrouper les opérations par groupe d'annonces plutôt que de mélanger les opérations qui affectent les critères de groupe d'annonces dans différents groupes d'annonces.
Atomicité dans la répartition par lot
L'API Google Ads divise les opérations d'un job par lot envoyé en sous-lots plus petits pour le traitement. Alors que les sous-lots standards s'exécutent avec l'échec partiel activé, les sous-lots de certaines opérations interdépendantes sont traités de manière atomique en tant que transaction unique :
- Opérations
AdGroupCriterionOperationconsécutives (create,updateetremove) pour les critèresLISTING_GROUP(AdGroupCriterion.listing_group) ciblant le mêmeAdGroup(échoue avecCriterionError.LISTING_GROUP_ERROR_IN_ANOTHER_OPERATIONsi une opération du groupe échoue). - Opérations
AssetGroupListingGroupFilterOperationconsécutives (create,updateetremove) ciblant le mêmeAssetGroup(échoue avecBatchJobError.ASSET_GROUP_LISTING_GROUP_FILTER_TRANSACTION_FAILUREsi une opération du groupe échoue). - Une opération
AssetGroupOperation(create) immédiatement suivie de 999 opérationsAssetGroupAssetOperation(create) au maximum ciblant le mêmeAssetGroup(échoue avecBatchJobError.ASSET_GROUP_AND_ASSET_GROUP_ASSET_TRANSACTION_FAILUREsi une opération du groupe échoue). ChaqueAssetGroupOperation(updateouremove) s'exécute dans son propre sous-lot autonome à opération unique. - Une opération
CampaignOperation(create) Performance Max avec les consignes relatives à la marque activées (brand_guidelines_enableddéfini surtrueou non défini, car il est défini par défaut surtrue, sauf s'il est explicitement défini surfalseou si vous créez une campagne Performance Max pour les objectifs de voyage) immédiatement suivie de jusqu'à 999 opérationsCampaignAssetOperation(create) ciblant le mêmeCampaign(échoue avecBatchJobError.CAMPAIGN_AND_CAMPAIGN_ASSET_TRANSACTION_FAILUREsi une opération du groupe échoue). Les campagnes Performance Max pour le retail (avec un flux Merchant Center) peuvent être créées sans associer de ressources de marqueCampaignAssetdans le même sous-lot atomique.
Pour les sous-lots de création AssetGroup et Performance Max Campaign (jusqu'à 1 000 opérations au total par sous-lot ; toutes les opérations create enfants au-delà de 999 sont reportées dans le sous-lot non atomique suivant) :
- L'opération
createparente (resource_namesurAssetGroupouCampaign) et ses opérationscreateenfants consécutives (asset_groupsurAssetGroupAssetoucampaignsurCampaignAsset) doivent spécifier le même ID temporaire négatif. - Placez toutes les opérations
AssetOperation(create) préalables pour les nouvelles ressourcesAssetavant l'opération parenteAssetGroupOperationouCampaignOperation(create), jamais entre l'opération parentecreateet ses opérations de liaison enfantscreate(ce qui fermerait immédiatement le sous-lot atomique et séparerait la création de la ressource parente de ses éléments associés).
Lorsqu'un sous-lot atomique échoue, l'BatchJobResult.status de l'opération incriminée contient l'erreur de validation sous-jacente, tandis que les opérations restantes de ce sous-lot sont annulées avec l'erreur de transaction correspondante pour ce sous-lot. Inspectez les entrées BatchJobResult adjacentes partageant le même ID AdGroup, AssetGroup ou Campaign pour identifier l'erreur d'origine.
Si les opérations associées dans l'un de ces groupes ne sont pas ajoutées consécutivement, l'API Google Ads les répartit dans des sous-lots distincts. Par conséquent, la modification ne respecte pas les exigences minimales concernant les composants ou laisse les arborescences de groupes de fiches incomplètes. Pour en savoir plus, consultez Utiliser des filtres de groupes de fiches dans des jobs par lot et Traitement par lot Performance Max.
Regroupement logique
Lorsque vous modifiez une hiérarchie de ciblage de produits (AssetGroupListingGroupFilterOperation dans les campagnes Performance Max ou AdGroupCriterionOperation dans les campagnes Shopping) ou que vous créez un AssetGroup ou un Campaign Performance Max, regroupez toutes les opérations ciblant la même ressource parente (AssetGroup, AdGroup ou Campaign) de manière consécutive. Cela réduit les conflits de verrouillage du backend et maintient les arbres interdépendants ensemble.
Cohérence des données
Étant donné que les arborescences de filtres de groupes de fiches et les exigences d'éléments Performance Max sont validées à la fin de chaque transaction de sous-lot atomique, évitez de diviser les mises à jour d'une même ressource parente sur des plages discontinues dans un job ou sur des jobs simultanés.
Éviter les problèmes de simultanéité
Lorsque vous envoyez plusieurs jobs simultanés pour le même compte, réduisez la probabilité que les jobs s'exécutent sur les mêmes objets en même temps, tout en conservant des jobs de grande taille. De nombreux jobs inachevés dont l'état est
RUNNINGet qui tentent de modifier le même ensemble d'objets peuvent entraîner des conditions de blocage, ce qui entraîne un ralentissement important, voire des échecs de jobs.N'envoyez pas plusieurs opérations qui modifient le même objet dans le même job, car le résultat peut être imprévisible.
Récupérer les résultats de manière optimale
N'interrogez pas l'état du job trop fréquemment, car vous risquez de rencontrer des erreurs de limitation du débit.
Laissez
page_sizenon défini (ou définissez-le sur la valeur maximale de1000) lorsque vous appelezListBatchJobResultspour minimiser les allers-retours de pagination, et ne définissezresponse_content_typesurMUTABLE_RESOURCEque si votre application inspecte les champs de ressources renvoyés au-delà deresource_name.L'ordre des résultats est le même que celui de l'importation.
Conseils d'utilisation supplémentaires
Vous pouvez définir une limite supérieure pour la durée d'exécution d'un job par lot avant son annulation. Lorsque vous créez un job par lot, définissez le champ
metadata.execution_limit_secondssur la limite de temps de votre choix, en secondes. Il n'y a pas de limite de temps par défaut simetadata.execution_limit_secondsn'est pas défini.Bien que la limite du protocole soit de 10 000 opérations par requête, nous vous recommandons de ne pas ajouter plus de 1 000 opérations par
AddBatchJobOperationsRequestet d'utilisersequence_tokenpour importer le reste des opérations dans le même job. Selon la taille des opérations, l'envoi d'un trop grand nombre d'opérations dans un seulAddBatchJobOperationsRequestpeut entraîner une erreurBatchJobError.REQUEST_TOO_LARGE. Vous pouvez résoudre cette erreur en réduisant le nombre d'opérations et en relançant la commandeAddBatchJobOperationsRequest.
Limites
Chaque
BatchJobaccepte jusqu'à un million d'opérations. Le dépassement de cette limite lors de l'appel deAddBatchJobOperationsrenvoie une erreurResourceCountLimitExceededError.RESOURCE_LIMIT(avecResourceLimitType.BATCH_JOB_OPERATIONS_PER_JOBdansErrorDetails.resource_count_details).Chaque compte peut comporter jusqu'à 100 jobs actifs ou en attente en même temps. Si vous dépassez cette limite lors de la création d'un job par lot avec
MutateBatchJob, une erreurResourceCountLimitExceededError.RESOURCE_LIMITest renvoyée (avecResourceLimitType.BATCH_JOBS_PER_CUSTOMERdansErrorDetails.resource_count_details).Les jobs en attente datant de plus de sept jours sont automatiquement supprimés.
Chaque
AddBatchJobOperationsRequestest soumis à une limite stricte de 10 000 opérations de mutation par requête. Si vous dépassez 10 000 opérations dans une même requête,une erreurBatchJobError.REQUEST_TOO_LARGEest renvoyée.Pour le champ
page_sizedansListBatchJobResultsRequest:- Si
page_sizen'est pas défini ou est défini sur0, la valeur par défaut est le maximum de1000. - Si
page_sizedépasse1000ou est inférieur à0, l'API renvoie une erreurBatchJobError.INVALID_PAGE_SIZE.
- Si
Chaque
AddBatchJobOperationsRequesta une taille maximale de 41 937 920 octets. Si vous dépassez cette limite, vous recevez une erreurBatchJobError.REQUEST_TOO_LARGE(ou une erreurINTERNAL_ERRORsi elle est rejetée au niveau de la couche transport). Vous pouvez déterminer la taille sérialisée de la requête avant de l'envoyer et prendre les mesures appropriées si elle est trop volumineuse :Java
static final int MAX_REQUEST_BYTES = 41_937_920; // ... (code to get the AddBatchJobOperationsRequest object) int sizeInBytes = request.getSerializedSize();C#
const int MAX_REQUEST_BYTES = 41_937_920; // ... (code to get the AddBatchJobOperationsRequest object) int sizeInBytes = request.CalculateSize();PHP
const MAX_REQUEST_BYTES = 41937920; // ... (code to get the AddBatchJobOperationsRequest object) $size_in_bytes = $request->byteSize();Python
MAX_REQUEST_BYTES = 41_937_920 # ... (code to get the AddBatchJobOperationsRequest object) size_in_bytes = type(request).pb(request).ByteSize()Ruby
MAX_REQUEST_BYTES = 41_937_920 # ... (code to get the AddBatchJobOperationsRequest object) size_in_bytes = request.to_proto.bytesizePerl
use JSON::XS; use constant MAX_REQUEST_BYTES => 41937920; # ... (code to get the AddBatchJobOperationsRequest object) # The Perl client library uses REST/JSON; UTF-8 JSON byte length provides a # conservative upper-bound estimate of the serialized request size. my $json_encoder = JSON::XS->new->utf8->convert_blessed; my $size_in_bytes = length($json_encoder->encode($request));
Taille d'une seule opération de modification
Bien que la requête globale puisse atteindre 41 937 920 octets, la taille sérialisée d'un seul MutateOperation dans le lot est limitée à 10 484 504 octets (10 Mio moins 1 256 octets). Si vous dépassez cette limite, l'erreur BatchJobError.REQUEST_TOO_LARGE s'affiche. Notez que, bien que la documentation de référence pour BatchJobError.REQUEST_TOO_LARGE cite le seuil de 10 484 504 octets, AddBatchJobOperations renvoie ce même code d'erreur lorsque l'un des trois seuils de requête (41 937 920 octets de requête au total, 10 484 504 octets d'opération unique ou 10 000 opérations par appel) est dépassé, le champ message de l'erreur spécifiant la limite qui a été enfreinte.