Tieni presente queste linee guida quando utilizzi BatchJobService.
Migliora il throughput
È preferibile un numero ridotto di job di grandi dimensioni rispetto a molti job di piccole dimensioni.
Ordina le operazioni caricate in base al tipo di operazione (ad eccezione delle operazioni interdipendenti che devono essere raggruppate consecutivamente in sub-batch atomici). Ad esempio, se il job contiene operazioni per aggiungere campagne standard, gruppi di annunci e criteri dei gruppi di annunci, ordina le operazioni nel caricamento in modo che tutte le operazioni relative alle campagne siano le prime, seguite da tutte le operazioni relative ai gruppi di annunci e infine da tutte le operazioni relative ai criteri dei gruppi di annunci.
Nell'ambito di operazioni dello stesso tipo, può migliorare le prestazioni raggrupparle per risorsa padre. Ad esempio, se hai una serie di oggetti
AdGroupCriterionOperation, è più efficiente raggruppare le operazioni per gruppo di annunci anziché combinare operazioni che influiscono sui criteri dei gruppi di annunci in gruppi di annunci diversi.
Atomicità nella suddivisione dei batch
L'API Google Ads suddivide le operazioni di un job batch inviato in batch secondari più piccoli per l'elaborazione. Mentre i sub-batch standard vengono eseguiti con l'errore parziale attivato, i sub-batch per determinate operazioni interdipendenti vengono elaborati in modo atomico come un'unica transazione:
- Operazioni
AdGroupCriterionOperationconsecutive (create,updateeremove) per i criteriLISTING_GROUP(AdGroupCriterion.listing_group) che hanno come target lo stessoAdGroup(non va a buon fine conCriterionError.LISTING_GROUP_ERROR_IN_ANOTHER_OPERATIONse un'operazione nel gruppo non va a buon fine). - Operazioni
AssetGroupListingGroupFilterOperationconsecutive (create,updateeremove) che hanno come target lo stessoAssetGroup(non riesce conBatchJobError.ASSET_GROUP_LISTING_GROUP_FILTER_TRANSACTION_FAILUREse un'operazione nel gruppo non riesce). - Un'operazione
AssetGroupOperation(create) seguita immediatamente da un massimo di 999 operazioniAssetGroupAssetOperation(create) che hanno come target lo stessoAssetGroup(non va a buon fine conBatchJobError.ASSET_GROUP_AND_ASSET_GROUP_ASSET_TRANSACTION_FAILUREse un'operazione nel gruppo non va a buon fine). OgniAssetGroupOperation(updateoremove) viene eseguito nel proprio sub-batch autonomo a singola operazione. - Una campagna Performance Max
CampaignOperation(create) con le linee guida per il brand attivate (brand_guidelines_enabledimpostato sutrueo non impostato, poiché il valore predefinito ètrue, a meno che non lo imposti esplicitamente sufalseo crei una campagna Performance Max per gli obiettivi di viaggio) seguita immediatamente da un massimo di 999 operazioniCampaignAssetOperation(create) che hanno come target lo stessoCampaign(non va a buon fine conBatchJobError.CAMPAIGN_AND_CAMPAIGN_ASSET_TRANSACTION_FAILUREse un'operazione nel gruppo non va a buon fine). Le campagne Performance Max di Servizi locali non supportano le linee guida per il brand e omettono le risorse del brandCampaignAsset(impostabrand_guidelines_enabledsufalsequando crei la campagna). Le campagne Performance Max per la vendita al dettaglio (con un feed di Merchant Center) possono omettere le risorse del brandCampaignAssetnello stesso sub-batch atomico solo quando crei una campagna senza asset e senza risorseAssetGroupAssetpersonalizzate (diverse dagli asset HTML5MEDIA_BUNDLE) o quandobrand_guidelines_enabledè impostato sufalse.
Per i sottogruppi di creazione di AssetGroup e Performance Max Campaign (fino a 1000 operazioni totali per sottogruppo; le operazioni create secondarie oltre 999 vengono trasferite al sottogruppo non atomico successivo):
- L'operazione
createprincipale (resource_namesuAssetGroupoCampaign) e le relative operazionicreatesecondarie consecutive (asset_groupsuAssetGroupAssetocampaignsuCampaignAsset) devono specificare lo stesso ID temporaneo negativo. - Inserisci tutte le operazioni
AssetOperation(create) prerequisito per le nuove risorseAssetprima delAssetGroupOperationoCampaignOperation(create) padre, mai tra ilcreatepadre e le operazioni di collegamento figliocreate(che chiuderebbero immediatamente il sub-batch atomico e separerebbero la creazione della risorsa padre dagli asset collegati).
Quando un sub-batch atomico non va a buon fine, l'operazione incriminata
BatchJobResult.status contiene l'errore di convalida
sottostante, mentre viene eseguito il rollback delle operazioni rimanenti nel sub-batch con l'errore di transazione corrispondente per quel sub-batch. Esamina le voci BatchJobResult adiacenti che condividono lo stesso ID AdGroup, AssetGroup o Campaign per identificare l'errore della causa principale.
Se le operazioni correlate in uno di questi gruppi non vengono aggiunte consecutivamente, l'API Google Ads le suddivide in batch secondari separati, il che comporta il mancato rispetto dei requisiti minimi degli asset o l'incompletezza degli alberi dei gruppi di schede. Per maggiori dettagli, consulta Utilizza i filtri dei gruppi di schede nei job batch ed Elaborazione batch di Performance Max.
Raggruppamento logico
Quando modifichi una gerarchia di targeting dei prodotti (AssetGroupListingGroupFilterOperation nelle campagne Performance Max o AdGroupCriterionOperation nelle campagne Shopping) o crei un nuovo AssetGroup o Campaign Performance Max, raggruppa tutte le operazioni che hanno come target la stessa risorsa principale (AssetGroup, AdGroup o Campaign) in modo consecutivo. In questo modo si riduce la contesa dei blocchi del backend e si mantengono uniti gli alberi interdipendenti.
Coerenza dei dati
Poiché gli alberi dei filtri dei gruppi di schede e i requisiti degli asset Performance Max vengono convalidati alla fine di ogni transazione atomica di un sub-batch, evita di suddividere gli aggiornamenti della stessa risorsa principale in intervalli non continui in un job o in job simultanei.
Evita problemi di contemporaneità
Quando invii più job contemporaneamente per lo stesso account, riduci la probabilità che i job operino sugli stessi oggetti nello stesso momento, mantenendo al contempo dimensioni elevate dei job. Molti job non completati con lo stato
RUNNINGche tentano di modificare lo stesso insieme di oggetti possono portare a condizioni simili a un deadlock, con conseguente grave rallentamento e persino errori dei job.Non inviare più operazioni che modificano lo stesso oggetto nello stesso job, poiché il risultato può essere imprevedibile.
Recuperare i risultati in modo ottimale
Non eseguire il polling dello stato del job troppo di frequente, altrimenti rischi di riscontrare errori di limitazione di frequenza.
Lascia
page_sizenon impostato (o impostalo sul valore massimo di1000) quando chiamiListBatchJobResultsper ridurre al minimo i round trip di paginazione e impostaresponse_content_typesuMUTABLE_RESOURCEsolo se la tua applicazione ispeziona i campi delle risorse restituiti oltreresource_name.L'ordine dei risultati è lo stesso dell'ordine di caricamento.
Indicazioni aggiuntive per l'utilizzo
Puoi impostare un limite superiore approssimativo per il tempo di esecuzione di un job batch prima che venga annullato. Quando crei un nuovo job batch, imposta il campo
metadata.execution_limit_secondssu un numero intero positivo per il limite di tempo che preferisci, in secondi. Semetadata.execution_limit_secondsnon è impostato, non esiste un limite di tempo predefinito.Sebbene il limite del protocollo sia di 10.000 operazioni per richiesta, ti consigliamo di non aggiungere più di 1000 operazioni per
AddBatchJobOperationsRequeste di utilizzaresequence_tokenper caricare il resto delle operazioni nello stesso job. A seconda delle dimensioni delle operazioni, l'invio di troppe operazioni in un singoloAddBatchJobOperationsRequestpuò causare un erroreBatchJobError.REQUEST_TOO_LARGE. Puoi gestire questo errore riducendo il numero di operazioni e riprovando l'operazioneAddBatchJobOperationsRequest.
Limitazioni
Ogni
BatchJobsupporta fino a un milione di operazioni. Il superamento di questo limite quando chiamiAddBatchJobOperationsrestituisce un erroreResourceCountLimitExceededError.RESOURCE_LIMIT(conResourceLimitType.BATCH_JOB_OPERATIONS_PER_JOBinErrorDetails.resource_count_details).Ogni account può avere fino a 100 job attivi o in attesa contemporaneamente. Il superamento di questo limite quando crei un job batch con
MutateBatchJobrestituisce un erroreResourceCountLimitExceededError.RESOURCE_LIMIT(conResourceLimitType.BATCH_JOBS_PER_CUSTOMERinErrorDetails.resource_count_details).I job in attesa più vecchi di 7 giorni vengono rimossi automaticamente.
Ogni
AddBatchJobOperationsRequestha un limite massimo di 10.000 operazioni di modifica per richiesta. Se superi le 10.000 operazioni in una singola richiesta,viene restituito un erroreBatchJobError.REQUEST_TOO_LARGE.Per il campo
page_sizeinListBatchJobResultsRequest:- Se
page_sizenon è impostato o è0, il valore predefinito è il massimo di1000. - Se
page_sizesupera1000o è inferiore a0, l'API restituisce un erroreBatchJobError.INVALID_PAGE_SIZE.
- Se
Ogni
AddBatchJobOperationsRequestha una dimensione massima di 41.937.920 byte. Se superi questo limite, ricevi un erroreBatchJobError.REQUEST_TOO_LARGE(o un erroreINTERNAL_ERRORse rifiutato a livello di trasporto). Puoi determinare le dimensioni serializzate della richiesta prima di inviarla e intraprendere l'azione appropriata se sono troppo grandi: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) # Supports both proto-plus (use_proto_plus=True) and native protobuf # (use_proto_plus=False) messages. pb = type(request).pb(request) if hasattr(type(request), "pb") else request size_in_bytes = pb.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));
Dimensioni di una singola operazione di modifica
Sebbene la richiesta complessiva possa essere di massimo 41.937.920 byte, la dimensione serializzata di un singolo MutateOperation all'interno del batch è limitata a 10.484.504 byte (10 MiB meno 1256 byte). Il superamento di questo limite restituisce un errore BatchJobError.REQUEST_TOO_LARGE. Tieni presente che, sebbene la documentazione di riferimento per BatchJobError.REQUEST_TOO_LARGE citi la soglia di 10.484.504 byte, AddBatchJobOperations restituisce lo stesso codice di errore quando viene superata una delle tre soglie di richiesta (41.937.920 byte di richiesta totali, 10.484.504 byte di singola operazione o 10.000 operazioni per chiamata), con il campo message dell'errore che specifica quale limite è stato violato.