İleri düzey kullanım

Bu kılavuzda, Java istemci kitaplığının daha gelişmiş özelliklerinden birkaçının nasıl özelleştirileceği açıklanmaktadır. Genel bir model, bu özelliklerin çoğunun standart yöntemler yerine temeldeki Callable kaynağına dayanmasıdır. Çağrı yapılabilir alan genellikle burada belgelenmemiş diğer RPC başına özellikleri aramak için iyi bir yerdir.

Engelleme

Java kitaplığı, zaman aşımlarını her çağrı düzeyinde ayarlamak için bir yüzey sağlar. Varsayılan değer, googleads_grpc_service_config.json dosyasındaki method_config/timeout ayarına göre belirlenir. API çağrısı için maksimum süre için daha kısa bir sınır uygulamanız gerekiyorsa daha düşük bir değer belirleyin.

Bu özelliği kullanmak için doğrudan çağrılabilir nesneyi kullanmanız gerekir. Örneğin, GoogleAdsService.searchStream() çağrılırsa zaman aşımı şu şekilde ayarlanır:

try (GoogleAdsServiceClient googleAdsServiceClient =
    googleAdsClient.getLatestVersion().createGoogleAdsServiceClient()) {
  // Constructs the SearchGoogleAdsStreamRequest.
  SearchGoogleAdsStreamRequest request = ...

  // Executes the API call, with a timeout of 5 minutes.
  ServerStream<SearchGoogleAdsStreamResponse> result = googleAdsServiceClient
      .searchStreamCallable()
      .call(request,
          GrpcCallContext.createDefault().withTimeout(Duration.of(5, ChronoUnit.MINUTES)));
}

Zaman aşımını 2 saat veya daha uzun olacak şekilde ayarlayabilirsiniz ancak API yine de çok uzun süreli istekleri zaman aşımına uğratabilir ve DEADLINE_EXCEEDED hatası döndürebilir. Bu durum bir sorun haline gelirse genellikle en iyi yöntem sorguyu bölmek ve parçaları paralel olarak yürütmektir. Böylece uzun süren bir isteğin başarısız olduğu durum önlenir ve isteği en baştan tetiklemenin tek yolu isteği yeniden tetiklemektir.

Yeniden deneme ayarları

Java kitaplığı, yeniden deneme ayarlarını çağrı başına düzeyde yapılandırmak için bir yüzey de sağlar. Bu özelliği kullanmak için doğrudan çağrılabilir nesneyi kullanmanız gerekir. Örneğin, GoogleAdsService.searchStream() çağrılıyorsa yeniden deneme ayarları aşağıdaki gibi yapılandırılır:

// Creates a context object with the custom retry settings.
GrpcCallContext context = GrpcCallContext.createDefault()
    .withRetrySettings(RetrySettings.newBuilder()
    .setInitialRetryDelay(Duration.ofMillis(10L))
    .setMaxRetryDelay(Duration.ofSeconds(10L))
    .setRetryDelayMultiplier(1.4)
    .setMaxAttempts(10)
    .setLogicalTimeout(Duration.ofSeconds(30L))
    .build());

// Creates and issues a search Google Ads stream request.
ServerStream<SearchGoogleAdsStreamResponse> stream =
    googleAdsServiceClient.searchStreamCallable().call(request, context);

Başlatma süresi performans optimizasyonu

Bir GoogleAdsClient örneği ilk kez oluşturulduğunda ufak bir gecikme fark edebilirsiniz. Bunun nedeni, hizmetler (GoogleAdsClient.getVersionXX()) için tüm API sınıflarını aynı anda yükleyen akıcı bir arayüzdür. Bu arayüz, hizmet sınıfları oluşturmak için daha uygun bir mekanizma sağlar.

İlk isteğin performansı, uygulamanız için kritik yoldaysa şu adımları uygulamanız gerekir:

  1. Kullanıcı isteklerini yayınlamadan önce başlangıçta GoogleAdsClient oluşturun.

  2. İşlem ilk kez başladığında Google Ads API'ye birkaç ısınma isteği gönderin. Örneğin:

    // Runs some warm-up requests.
    try (GoogleAdsServiceClient googleAdsServiceClient =
        googleAdsClient.getLatestVersion().createGoogleAdsServiceClient()) {
      // Runs 5 warm-up requests. In our profiling we see that 90% of performance
      // loss is only experienced on the first API call. After 3 subsequent calls we
      // saw a negligible improvement in performance.
      for (int i = 0; i < 5; ++i) {
        // Warm-up queries are run with a nonexistent CID so the calls will fail. If
        // you have a CID that you know will be accessible with the OAuth
        // credentials provided you may want to provide that instead and avoid the
        // try-catch.
        try {
          googleAdsServiceClient.search("-1", "Warm-up query");
        } catch (GoogleAdsException ex) {
          // Do nothing, we're expecting this to fail.
        }
      }
    }
    

Isınma isteklerinin işlem başına yalnızca bir kez çalıştırılması gerekir. Sonraki her hizmet istemcisi oluşturma işlemi, önceden yüklenmiş sınıfları otomatik olarak yeniden kullanır.

Hizmet istemcisinin yeniden kullanımı

GoogleAdsClient.getVersionXXX().createYYYServiceClient() öğesine yapılan her çağrı yeni bir TCP bağlantısı oluşturacağı için mümkün olduğunda hizmet istemcisi örneklerini yeniden kullanmalısınız.

Artık gerekli olmadığında istemciyi kapattığınızdan emin olmanız gerekir. Bu işlem, kaynaklarla deneyin blokunda veya hizmet istemcisinde close() çağrısı yapılarak yapılabilir.

API istekleri yapmak için kapalı bir hizmet istemcisi kullanmaya çalışırsanız hizmet istemcisi yöntemi java.util.concurrent.RejectedExecutionException hatası verir.

JAR'nin boyutu 32 MB'tan büyükse App Engine dağıtılamaz

App Engine'de, yüklenen her dosya için 32 MB'lık kota bulunur. google-ads için JAR, gölge/gölge jar dağıtımını kullanarak daha da büyük olacak. Jajar'ları elle dağıtıyorsanız aşağıdaki gibi hatalarla karşılaşabilirsiniz:

ERROR: (gcloud.app.deploy) Cannot upload file [<your-app>/WEB-INF/lib/google-ads-14.0.0.jar],
which has size [66095767] (greater than maximum allowed size of [33554432])

Bunun yerine, AppEngine Gradle eklentisini veya Maven eklentisini kullanarak dağıtım yapın. Her jargonu 10 MB'lık parçalara ayıracak ve onun yerine bunları yükleyecek olan enableJarSplitting seçeneği vardır.

Gölge bağımlılıkları

Projenizde kitaplıkla çakışan bağımlılıklar varsa aşağıdaki komutlardan birini kullanarak projenizin bağımlılıklarını incelemeli ve ardından projenizin bağımlılıklarını gerektiği şekilde değiştirmelisiniz.

Maven

mvn dependency:tree

Gradle

./gradlew dependencies

Bağımlılık çakışmalarının çözümü uygun değilse bunun yerine kitaplığın shaded sürümüne güvenebilirsiniz.

Maven

<dependency>
  <groupId>com.google.api-ads</groupId>
  <artifactId>google-ads-shadowjar</artifactId>
  <version>31.0.0</version>
</dependency>

Gradle

implementation 'com.google.api-ads:google-ads-shadowjar:31.0.0'