İleri düzey kullanım

Bu kılavuzda, Java istemci kitaplığının daha gelişmiş yönlerinden bazılarını nasıl özelleştireceğiniz açıklanmaktadır. Bu özelliklerin çoğu, standart yöntemler yerine temel Callable'ye dayanır. Genel olarak, burada belgelenmemiş diğer RPC başına özellikler için aranabilecek iyi bir yerdir.

Zaman aşımı

Java kitaplığı, zaman aşımlarını ç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. Bir API çağrısının maksimum süresine daha kısa bir sınır uygulamanız gerekiyorsa daha düşük bir değer ayarlayın.

Bu özelliği kullanmak için çağrılabilir nesneyi doğrudan kullanmanız gerekir. Örneğin, GoogleAdsService.searchStream() çağrılıyorsa 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 fazla olarak ayarlayabilirsiniz ancak API, çok uzun süren isteklerde zaman aşımına uğrayabilir ve DEADLINE_EXCEEDED hatası döndürebilir. Bu durum sorun haline gelirse sorguyu bölmek ve parçaları paralel olarak yürütmek genellikle en iyi çözümdür. Bu sayede, uzun süren bir isteğin başarısız olduğu ve kurtarmanın tek yolunun isteği baştan tekrar tetiklemek olduğu durum önlenir.

Yeniden deneme ayarları

Java kitaplığı, yeniden deneme ayarlarını çağrı düzeyinde yapılandırmak için de bir yüzey sağlar. Bu özelliği kullanmak için çağrılabilir nesneyi doğrudan 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

İlk kez GoogleAdsClient örneği oluşturulurken küçük bir gecikme yaşayabilirsiniz. Bunun nedeni, hizmetler için akıcı arayüzdür (GoogleAdsClient.getVersionXX()). Bu arayüz, hizmet sınıfları oluşturmak için daha uygun bir mekanizma sağlamak amacıyla tüm API sınıflarını aynı anda yükler.

İlk istek performansı uygulamanızın kritik yolundaysa aşağıdaki adımları uygulamanız gerekir:

  1. Kullanıcı isteklerine hizmet vermeden önce, başlatma sırasında GoogleAdsClient oluşturun.

  2. İşlem ilk 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 her işlem için yalnızca bir kez çalıştırılması gerekir. Sonraki her hizmet istemcisi oluşturma işleminde önceden yüklenmiş sınıflar otomatik olarak yeniden kullanılır.

Hizmet istemcisinin yeniden kullanılması

GoogleAdsClient.getVersionXXX().createYYYServiceClient() işlevine yapılan her çağrı yeni bir TCP bağlantısı oluşturacağından, pratik olduğu durumlarda hizmet istemcisi örneklerini yeniden kullanmanız gerekir.

Artık gerekmediğinde istemciyi kapattığınızdan emin olmanız gerekir. Bu işlem, try-with-resources bloğunda veya hizmet istemcisinde close() çağrılarak yapılabilir.

API istekleri göndermek için kapalı bir hizmet istemcisi kullanmaya çalışırsanız hizmet istemcisi yöntemi java.util.concurrent.RejectedExecutionException oluşturur.

JAR dosyası 32 MB'tan büyükse App Engine dağıtımı başarısız oluyor

App Engine'de yüklenen her dosya için 32 MB kota vardır. google-ads için JAR, shade/shadow jar dağıtımları kullanıldığında çok daha büyük olacaktır. JAR'ları manuel olarak dağıtırsanız aşağıdaki gibi hatalarla karşılaşabilirsiniz:

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

Bunun yerine, App Engine Gradle eklentisini veya Maven eklentisini kullanarak dağıtın. Her birinde, her kavanozu 10 MB'lık parçalara bölüp bunları yükleyecek bir 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, ardından projenizin bağımlılıklarını gerektiği gibi değiştirmelisiniz.

Maven

mvn dependency:tree

Gradle

./gradlew dependencies

Bağımlılık çakışmalarını çözmek mümkün değilse bunun yerine kitaplığın gölgelenmiş sürümünü kullanabilirsiniz.

Maven

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

Gradle

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