Trasmetti report in streaming utilizzando GoogleAdsService

Per recuperare le entità e i dati dei report dell'API Google Ads, utilizza uno dei seguenti metodi:

Ecco le distinzioni di alto livello per i due metodi:

GoogleAdsService.SearchStream GoogleAdsService.Search
Adatto al codice di produzione Sì Sì
Servizio GoogleAdsService GoogleAdsService
Scenario Recupero di oggetti e report Recupero di oggetti e report
Risposta Stream di GoogleAdsRow oggetti Pagine di oggetti GoogleAdsRow
Campi della risposta Solo quelli specificati nella query Solo quelli specificati nella query
Limiti giornalieri Limiti giornalieri in base ai livelli di accesso Limiti giornalieri in base ai livelli di accesso

Mentre Search invia più richieste impaginate 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ò iterare sui batch in arrivo 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 seguente tabella mostra le differenze tra le richieste e le risposte dei due metodi:

SearchStream Cerca
Dimensioni pagina Non applicabile 10.000 righe per pagina
Numero di richieste API 1 richiesta 10 richieste
Numero di risposte 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 sola pagina (meno di 10.000 righe): non ci sono differenze significative di rendimento tra i due metodi.
  • Report di più pagine:SearchStream in genere è più veloce perché si evitano più round trip 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, itera i blocchi di stream ed elabora le righe man mano che arrivano anziché memorizzare nel buffer tutte le righe in memoria contemporaneamente per evitare errori di esaurimento della memoria (OOM).
  • Resilienza della connessione:poiché SearchStream si basa su una connessione persistente, gli stream a esecuzione prolungata possono essere interrotti da interruzioni di rete o timeout della scadenza. Configura i timeout RPC appropriati e implementa la logica di ripetizione dei tentativi per gli errori temporanei del flusso.

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 logico viene conteggiata come un'operazione ai fini della quota giornaliera di operazioni, 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.

Esempio di codice

Il seguente esempio di codice mostra come eseguire una query di report in 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;
}
      

curl