Per recuperare le entità dell'API Google Ads e i dati dei report, utilizza uno dei seguenti metodi:
Ecco le distinzioni di alto livello per i due metodi:
| GoogleAdsService.SearchStream | GoogleAdsService.Search | |
|---|---|---|
| Adatto per il codice di produzione | Sì | Sì |
| Servizio | GoogleAdsService |
GoogleAdsService |
| Scenario | Recupero di oggetti e report | Recupero di oggetti e report |
| Risposta | Stream di oggetti GoogleAdsRow |
Pagine di GoogleAdsRow oggetti |
| Campi della risposta | Solo quelli specificati nella query | Solo quelli specificati nella query |
| Limiti giornalieri | Limiti giornalieri basati sui livelli di accesso | Limiti giornalieri basati sui livelli di accesso |
SearchStream contro Search
Mentre Search invia più richieste paginate per
scaricare un intero report, SearchStream invia
una singola richiesta e avvia una connessione gRPC persistente con l'API Google Ads
indipendentemente dalle dimensioni del report.
Per SearchStream, i pacchetti di dati iniziano a essere scaricati immediatamente in batch di
SearchGoogleAdsStreamResponse oggetti. Il codice può eseguire l'iterazione sui batch in entrata man mano che arrivano senza attendere il completamento dell'intero stream.
Eliminando il tempo di andata e ritorno della rete necessario per richiedere ogni singola
pagina di una risposta Search, SearchStream offre prestazioni migliori rispetto alla
paginazione, soprattutto per i report di grandi dimensioni.
Esempio
Questo esempio esamina un report composto da 100,000 righe. La tabella seguente suddivide le differenze tra richiesta e risposta tra i due metodi:
| SearchStream | Search | |
|---|---|---|
| Dimensioni pagina | Non applicabile | 10.000 righe per pagina |
| Numero di richieste API | 1 richiesta | 10 richieste |
| Numero di risposte dell'API | 1 stream continuo | 10 risposte |
Fattori di rendimento
Per la maggior parte dei casi d'uso, consigliamo SearchStream rispetto a Search per i seguenti
motivi:
- Report di una singola pagina (meno di 10.000 righe): non ci sono differenze di prestazioni significative tra i due metodi.
- Report di più pagine:
SearchStreamè in genere più veloce perché vengono evitati più andata e ritorno di rete e la lettura o la scrittura dalla cache del disco è meno importante. - Efficienza della memoria: quando elabori report di grandi dimensioni con
SearchStream, esegui l'iterazione sui blocchi di stream ed elabora le righe man mano che arrivano anziché memorizzare tutte le righe nella memoria contemporaneamente per evitare errori di esaurimento della memoria (OOM). - Resilienza della connessione: poiché
SearchStreamsi basa su una connessione persistente, gli stream a lunga esecuzione possono essere interrotti da interruzioni di rete o timeout di scadenza. Configura i timeout RPC appropriati e implementa la logica di ripetizione per gli errori di stream temporanei.
Limiti di frequenza
I limiti operativi giornalieri per entrambi i metodi rispettano i limiti standard e i
livelli di accesso del tuo progetto Google Cloud. Una singola query di report logica
viene conteggiata come un'operazione ai fini della quota operativa giornaliera
indipendentemente dal fatto che il risultato venga trasmesso in streaming con SearchStream o recuperato
su più pagine memorizzate nella cache utilizzando Search con un page_token. Tuttavia, ogni richiesta Search paginata viene comunque conteggiata come una singola chiamata RPC rispetto ai limiti di frequenza a breve termine.
Codice di esempio
Il seguente esempio di codice mostra come eseguire una query di report di streaming utilizzando le librerie client:
Java
private void runExample(GoogleAdsClient googleAdsClient, long customerId) { try (GoogleAdsServiceClient googleAdsServiceClient = googleAdsClient.getLatestVersion().createGoogleAdsServiceClient()) { String query = "SELECT campaign.id, campaign.name FROM campaign ORDER BY campaign.id"; // Constructs the SearchGoogleAdsStreamRequest. SearchGoogleAdsStreamRequest request = SearchGoogleAdsStreamRequest.newBuilder() .setCustomerId(Long.toString(customerId)) .setQuery(query) .build(); // Creates and issues a search Google Ads stream request that will retrieve all campaigns. ServerStream<SearchGoogleAdsStreamResponse> stream = googleAdsServiceClient.searchStreamCallable().call(request); // Iterates through and prints all of the results in the stream response. for (SearchGoogleAdsStreamResponse response : stream) { for (GoogleAdsRow googleAdsRow : response.getResultsList()) { System.out.printf( "Campaign with ID %d and name '%s' was found.%n", googleAdsRow.getCampaign().getId(), googleAdsRow.getCampaign().getName()); } } } }
C#
public void Run(GoogleAdsClient client, long customerId) { // Get the GoogleAdsService. GoogleAdsServiceClient googleAdsService = client.GetService( Services.V25.GoogleAdsService); // Create a query that will retrieve all campaigns. string query = @"SELECT campaign.id, campaign.name, campaign.network_settings.target_content_network FROM campaign ORDER BY campaign.id"; try { // Issue a search request. googleAdsService.SearchStream(customerId.ToString(), query, delegate (SearchGoogleAdsStreamResponse resp) { foreach (GoogleAdsRow googleAdsRow in resp.Results) { Console.WriteLine("Campaign with ID {0} and name '{1}' was found.", googleAdsRow.Campaign.Id, googleAdsRow.Campaign.Name); } } ); } catch (GoogleAdsException e) { Console.WriteLine("Failure:"); Console.WriteLine($"Message: {e.Message}"); Console.WriteLine($"Failure: {e.Failure}"); Console.WriteLine($"Request ID: {e.RequestId}"); throw; } }
PHP
public static function runExample(GoogleAdsClient $googleAdsClient, int $customerId) { $googleAdsServiceClient = $googleAdsClient->getGoogleAdsServiceClient(); // Creates a query that retrieves all campaigns. $query = 'SELECT campaign.id, campaign.name FROM campaign ORDER BY campaign.id'; // Issues a search stream request. /** @var GoogleAdsServerStreamDecorator $stream */ $stream = $googleAdsServiceClient->searchStream( SearchGoogleAdsStreamRequest::build($customerId, $query) ); // Iterates over all rows in all messages and prints the requested field values for // the campaign in each row. foreach ($stream->iterateAllElements() as $googleAdsRow) { /** @var GoogleAdsRow $googleAdsRow */ printf( "Campaign with ID %d and name '%s' was found.%s", $googleAdsRow->getCampaign()->getId(), $googleAdsRow->getCampaign()->getName(), PHP_EOL ); } }
Python
def main(client: GoogleAdsClient, customer_id: str) -> None: ga_service: GoogleAdsServiceClient = client.get_service("GoogleAdsService") query: str = """ SELECT campaign.id, campaign.name FROM campaign ORDER BY campaign.id""" # Issues a search request using streaming. stream: Iterator[SearchGoogleAdsStreamResponse] = ga_service.search_stream( customer_id=customer_id, query=query ) for batch in stream: rows: List[GoogleAdsRow] = batch.results for row in rows: print( f"Campaign with ID {row.campaign.id} and name " f'"{row.campaign.name}" was found.' )
Ruby
def get_campaigns(customer_id) # GoogleAdsClient will read a config file from # ENV['HOME']/google_ads_config.rb when called without parameters client = Google::Ads::GoogleAds::GoogleAdsClient.new responses = client.service.google_ads.search_stream( customer_id: customer_id, query: 'SELECT campaign.id, campaign.name FROM campaign ORDER BY campaign.id', ) responses.each do |response| response.results.each do |row| puts "Campaign with ID #{row.campaign.id} and name '#{row.campaign.name}' was found." end end end
Perl
sub get_campaigns { my ($api_client, $customer_id) = @_; # Create a search Google Ads stream request that will retrieve all campaigns. my $search_stream_request = Google::Ads::GoogleAds::V25::Services::GoogleAdsService::SearchGoogleAdsStreamRequest ->new({ customerId => $customer_id, query => "SELECT campaign.id, campaign.name FROM campaign ORDER BY campaign.id" }); # Get the GoogleAdsService. my $google_ads_service = $api_client->GoogleAdsService(); my $search_stream_handler = Google::Ads::GoogleAds::Utils::SearchStreamHandler->new({ service => $google_ads_service, request => $search_stream_request }); # Issue a search request and process the stream response to print the requested # field values for the campaign in each row. $search_stream_handler->process_contents( sub { my $google_ads_row = shift; printf "Campaign with ID %d and name '%s' was found.\n", $google_ads_row->{campaign}{id}, $google_ads_row->{campaign}{name}; }); return 1; }