Verwenden Sie eine der folgenden Methoden, um Google Ads API-Entitäten und Berichtsdaten abzurufen:
Hier sind die wichtigsten Unterschiede zwischen den beiden Methoden:
| GoogleAdsService.SearchStream | GoogleAdsService.Search | |
|---|---|---|
| Geeignet für Produktionscode | Ja | Ja |
| Dienst | GoogleAdsService |
GoogleAdsService |
| Szenario | Objekte und Berichte abrufen | Objekte und Berichte abrufen |
| Antwort | Stream von GoogleAdsRow-Objekten |
Seiten mit GoogleAdsRow-Objekten |
| Felder der Antwort | Nur die in der Abfrage angegebenen | Nur die in der Abfrage angegebenen |
| Tageslimits | Tageslimits basierend auf Zugriffsebenen | Tageslimits basierend auf Zugriffsebenen |
SearchStream im Vergleich zu Search
Bei Search werden mehrere paginierte Anfragen gesendet, um einen vollständigen Bericht herunterzuladen. Bei SearchStream wird unabhängig von der Berichtsgröße eine einzelne Anfrage gesendet und eine persistente gRPC-Verbindung mit der Google Ads API hergestellt.
Bei SearchStream werden Datenpakete sofort in Batches von SearchGoogleAdsStreamResponse Objekten heruntergeladen. Ihr Code kann eingehende Batches durchlaufen, sobald sie eintreffen, ohne auf den Abschluss des gesamten Streams zu warten.
Da die Roundtrip-Netzwerkzeit entfällt, die zum Anfordern jeder einzelnen Seite einer Search-Antwort erforderlich ist, bietet SearchStream eine bessere Leistung als die Paginierung, insbesondere bei großen Berichten.
Beispiel
In diesem Beispiel wird ein Bericht mit 100,000 Zeilen betrachtet. In der folgenden Tabelle sind die Unterschiede zwischen den beiden Methoden in Bezug auf Anfragen und Antworten aufgeschlüsselt:
| SearchStream | Suchen | |
|---|---|---|
| Seitengröße | Nicht zutreffend | 10.000 Zeilen pro Seite |
| Anzahl der API-Anfragen | 1 Anfrage | 10 Anfragen |
| Anzahl der API-Antworten | 1 kontinuierlicher Stream | 10 Antworten |
Leistungsfaktoren
Für die meisten Anwendungsfälle empfehlen wir SearchStreamSearch aus den folgenden
Gründen:
- Berichte mit einer Seite (unter 10.000 Zeilen): Es gibt keine signifikanten Leistungsunterschiede zwischen den beiden Methoden.
- Berichte mit mehreren Seiten:
SearchStreamist in der Regel schneller, da mehrere Netzwerk-Roundtrips vermieden werden und das Lesen oder Schreiben aus dem Datenträger-Cache weniger ins Gewicht fällt. - Speichereffizienz:Wenn Sie große Berichte mit
SearchStreamverarbeiten, sollten Sie Stream-Chunks durchlaufen und Zeilen verarbeiten, sobald sie eintreffen. So vermeiden Sie OOM-Fehler (Out-of-Memory), die auftreten können, wenn alle Zeilen gleichzeitig im Arbeitsspeicher gepuffert werden. - Verbindungsstabilität:Da
SearchStreamauf einer persistenten Verbindung basiert, können lang laufende Streams durch Netzwerkunterbrechungen oder Zeitüberschreitungen unterbrochen werden. Konfigurieren Sie geeignete RPC-Zeitüberschreitungen und implementieren Sie die Wiederholungslogik für vorübergehende Streamfehler.
Ratenlimits
Die täglichen Betriebslimits für beide Methoden entsprechen den Standardlimits und Zugriffsebenen Ihres Google Cloud-Projekts. Eine einzelne logische Berichtsanfrage wird auf Ihr tägliches Vorgangskontingent angerechnet, unabhängig davon, ob das Ergebnis mit SearchStream gestreamt oder mit Search und einem page_token über mehrere im Cache gespeicherte Seiten abgerufen wird. Jede ausgelagerte Search-Anfrage wird jedoch weiterhin als einzelner RPC-Aufruf auf kurzfristige Ratenlimits angerechnet.
Codebeispiel
Das folgende Codebeispiel zeigt, wie Sie mithilfe der Clientbibliotheken eine Streaming-Berichtsanfrage ausführen:
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; }