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
Während Search mehrere paginierte Anfragen sendet, um
einen vollständigen Bericht herunterzuladen, sendet SearchStream
eine einzelne Anfrage und initiiert unabhängig von der Berichtsgröße eine persistente gRPC-Verbindung mit der Google Ads API.
Bei SearchStream werden Datenpakete sofort in Batches von
SearchGoogleAdsStreamResponse-Objekten heruntergeladen. Ihr Code kann die eingehenden Batches verarbeiten, sobald sie eintreffen, ohne auf den Abschluss des gesamten Streams zu warten.
Da die Round-Trip-Zeit des Netzwerks entfällt, die für das 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 Anfrage und Antwort aufgeschlüsselt:
| SearchStream | Search | |
|---|---|---|
| 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 SearchStream anstelle von Search aus folgenden
Gründen:
- Berichte mit einer Seite (weniger als 10.000 Zeilen): Es gibt keine wesentlichen Leistungsunterschiede zwischen den beiden Methoden.
- Berichte mit mehreren Seiten:
SearchStreamist in der Regel schneller, da mehrere Round-Trips im Netzwerk vermieden werden und das Lesen oder Schreiben aus dem Festplatten-Cache eine geringere Rolle spielt. - Speichereffizienz: Wenn Sie große Berichte mit
SearchStreamverarbeiten, iterieren Sie durch Stream-Chunks und verarbeiten Sie Zeilen, sobald sie eintreffen. So vermeiden Sie, dass alle Zeilen gleichzeitig im Arbeitsspeicher gepuffert werden, was zu OOM-Fehlern (Out-of-Memory) führen kann. - Verbindungsresilienz: Da
SearchStreamauf einer persistenten Verbindung basiert, können lange Streams durch Netzwerkunterbrechungen oder Zeitüberschreitungen unterbrochen werden. Konfigurieren Sie geeignete RPC-Zeitlimits und implementieren Sie eine Wiederholungslogik für vorübergehende Stream-Fehler.
Ratenbegrenzung
Die täglichen Limits für Vorgänge für beide Methoden entsprechen den Standardlimits und
Zugriffsebenen Ihres Google Cloud-Projekts. Eine einzelne logische
Berichtsabfrage wird als ein Vorgang 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 paginierte Search-Anfrage wird jedoch weiterhin als einzelner RPC-Aufruf auf die kurzfristigen Ratenbegrenzungen angerechnet.
Codebeispiel
Das folgende Codebeispiel zeigt, wie Sie mit den Clientbibliotheken eine Streaming-Berichtsabfrage 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; }