Google Ads API varlıklarını ve raporlama verilerini almak için aşağıdaki yöntemlerden birini kullanın:
İki yöntem arasındaki temel farklar şunlardır:
| GoogleAdsService.SearchStream | GoogleAdsService.Search | |
|---|---|---|
| Üretim kodu için uygundur. | Evet | Evet |
| Hizmet | GoogleAdsService |
GoogleAdsService |
| Senaryo | Nesneleri ve raporları getirme | Nesneleri ve raporları getirme |
| Yanıt | GoogleAdsRow nesnelerinin akışı |
GoogleAdsRow nesnelerinin sayfaları |
| Yanıtın alanları | Yalnızca sorguda belirtilenler | Yalnızca sorguda belirtilenler |
| Günlük sınırlar | Erişim düzeylerine dayalı günlük sınırlar | Erişim düzeylerine dayalı günlük sınırlar |
SearchStream ve Search karşılaştırması
Search, bir raporun tamamını indirmek için birden fazla sayfalandırılmış istek gönderirken SearchStream tek bir istek gönderir ve rapor boyutundan bağımsız olarak Google Ads API ile kalıcı bir gRPC bağlantısı başlatır.
SearchStream için veri paketleri, SearchGoogleAdsStreamResponse nesnelerden oluşan gruplar halinde hemen indirilmeye başlar. Kodunuz, akışın tamamlanmasını beklemeden gelen grupları geldikçe yineleyebilir.
Search yanıtının SearchStream her bir sayfasını istemek için gereken gidiş dönüş ağ süresini ortadan kaldırarak özellikle büyük raporlarda sayfalama işlemine kıyasla daha iyi performans sunar.
Örnek
Bu örnekte, 100,000 satırdan oluşan bir rapor incelenmektedir. Aşağıdaki tabloda, iki yöntem arasındaki istek ve yanıt farklılıkları açıklanmaktadır:
| SearchStream | Ara | |
|---|---|---|
| Sayfa boyutu | Geçerli Değil | Sayfa başına 10.000 satır |
| API isteklerinin sayısı | 1 istek | 10 istek |
| API yanıtlarının sayısı | 1 sürekli akış | 10 yanıt |
Performans faktörleri
Çoğu kullanım alanında, aşağıdaki nedenlerden dolayı SearchStream yerine Search kullanmanızı öneririz:
- Tek sayfalık raporlar (10.000 satırdan az): İki yöntem arasında önemli performans farkları yoktur.
- Çok sayfalı raporlar:
SearchStreamgenellikle daha hızlıdır. Bunun nedeni, birden fazla ağ gidiş dönüşünün önlenmesi ve disk önbelleğinden okuma veya yazma işleminin daha az etkili olmasıdır. - Bellek verimliliği:
SearchStreamile büyük raporları işlerken bellek yetersiz (OOM) hatalarını önlemek için tüm satırları bellekte aynı anda arabelleğe almak yerine akış parçalarını yineleyin ve satırları geldikçe işleyin. - Bağlantı esnekliği:
SearchStream, kalıcı bir bağlantıya dayandığı için uzun süren yayınlar ağ kesintileri veya zaman aşımı nedeniyle kesilebilir. Uygun TBG zaman aşımlarını yapılandırın ve geçici akış hataları için yeniden deneme mantığını uygulayın.
Hız sınırları
Her iki yöntem için de günlük işlem sınırları, Google Cloud projenizin standart sınırlarına ve erişim düzeylerine uygundur. Tek bir mantıksal rapor sorgusu, sonuç SearchStream ile yayınlanıp yayınlanmadığına veya page_token ile Search kullanılarak birden fazla önbelleğe alınmış sayfadan alınıp alınmadığına bakılmaksızın günlük işlem kotanız kapsamında tek bir işlem olarak sayılır. Ancak her Search sayfalandırılmış istek, kısa vadeli sıklık sınırlarına karşı ayrı bir RPC çağrısı olarak sayılır.
Kod örneği
Aşağıdaki kod örneğinde, istemci kitaplıklarını kullanarak nasıl yayın raporu sorgusu yürütüleceği gösterilmektedir:
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; }