İleri düzey kullanım

Bu kılavuzda, Java istemci kitaplığının daha gelişmiş özelliklerinden bazılarının nasıl özelleştirileceği açıklanmaktadır. Bu özelliklerin çoğunun standart yöntemler yerine temel Callable'e dayalı olması yaygın bir durumdur. Genellikle, burada açıklanmayan diğer RPC başına özellikleri çağrılabilir işlevde bulabilirsiniz.

Zaman aşımı

Java kitaplığı, zaman aşımları için çağrı bazında ayarlama yapma olanağı sunar. Varsayılan değer, googleads_grpc_service_config.json dosyasında method_config/timeout ayarına göre belirlenir. Bir API çağrısının maksimum süresi için daha kısa bir sınır uygulamanız gerekiyorsa daha düşük bir değer ayarlayın.

Bu özelliği kullanmak için doğrudan çağrılabilir nesneyi 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 isteklerin zaman aşımına uğramasına ve DEADLINE_EXCEEDED hatası döndürmesine neden olabilir. Bu bir sorun haline gelirse genellikle sorguyu bölmek ve parçaları paralel olarak yürütmek en iyisidir. Bu sayede, uzun süre çalışan bir isteğin başarısız olduğu ve tek kurtarma yönteminin isteği baştan tetiklemek olduğu durumlar önlenir.

Ayarları yeniden dene

Java kitaplığı, yeniden deneme ayarlarını arama başına düzeyinde yapılandırma için de bir platform sağlar. Bu özelliği kullanmak için doğrudan çağrılabilir nesneyi kullanmanız gerekir. Örneğin, GoogleAdsService.searchStream() numarası arandığında 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 küçük bir gecikme fark edebilirsiniz. Bunun nedeni, hizmet sınıfları oluşturmak için daha uygun bir mekanizma sağlamak amacıyla tüm API sınıflarını tek seferde yükleyen hizmetler için akıcı arayüzdür (GoogleAdsClient.getVersionXX()).

İlk istek performansı, uygulamanız için kritik yoldaysa aşağıdaki adımları uygulamanız gerekir:

  1. GoogleAdsClient öğesini, kullanıcı isteklerini sunmadan önce başlatma sırasında 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ıtma isteklerinin işlem başına yalnızca bir kez çalıştırılması gerekir. Daha sonra oluşturulan her hizmet istemcisi, önceden yüklenmiş sınıfları otomatik olarak yeniden kullanır.

Hizmet istemcisinin yeniden kullanımı

GoogleAdsClient.getVersionXXX().createYYYServiceClient() çağrısının her biri yeni bir TCP bağlantısı oluşturacağından, mümkün olduğunda hizmet istemci örneklerini yeniden kullanmanız gerekir.

Artık gerekli olmadığında 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 isteği göndermek için kapalı bir hizmet istemcisi kullanmaya çalışırsanız hizmet istemcisi yöntemi bir java.util.concurrent.RejectedExecutionException hatası oluşturur.

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

App Engine'da her yüklenen dosya için 32 MB kota vardır. google-ads için JAR, bundan çok daha büyük olacaktır. Daha da önemlisi, gölge/gölge JAR dağıtımları kullanıldığında bu boyut daha da artar. Jar dosyalarını manuel olarak dağıtırsanız aşağıdaki gibi hatalar alabilirsiniz:

ERROR: (gcloud.app.deploy) Cannot upload file [<your-app>/WEB-INF/lib/google-ads-34.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 biri için enableJarSplitting seçeneği vardır. Bu seçenek, her bir kavanozu 10 MB'lık parçalara böler ve bunların yerine bunları yükler.

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ı inceleyip ardından projenizin bağımlılıkları gerektiği gibi değiştirmeniz gerekir.

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ölgeli sürümünü kullanabilirsiniz.

Maven

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

Gradle

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