İleri düzey kullanım

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

Zaman aşımı

Java kitaplığı, her çağrı düzeyinde zaman aşımları ayarlamak için bir yüzey sağlar. Varsayılan değer, googleads_grpc_service_config.json'daki 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 Callable nesnesini doğrudan çağırın. Örneğin, GoogleAdsService.searchStream() çağrısı yaparken zaman aşımını aşağıdaki gibi ayarlayın:

try (GoogleAdsServiceClient googleAdsServiceClient =
    googleAdsClient.getLatestVersion().createGoogleAdsServiceClient()) {
  // Constructs the SearchGoogleAdsStreamRequest.
  SearchGoogleAdsStreamRequest request =
      SearchGoogleAdsStreamRequest.newBuilder()
          .setCustomerId(Long.toString(customerId))
          .setQuery("SELECT campaign.id, campaign.name FROM campaign")
          .build();

  // Executes the API call with a timeout of 5 minutes.
  ServerStream<SearchGoogleAdsStreamResponse> stream =
      googleAdsServiceClient
          .searchStreamCallable()
          .call(
              request,
              GrpcCallContext.createDefault()
                  .withTimeout(Duration.of(5, ChronoUnit.MINUTES)));
  for (SearchGoogleAdsStreamResponse response : stream) {
    // Processes the response rows.
  }
}

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 genellikle sorguyu bölmek ve parçaları paralel olarak yürütmek en iyisidir. 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.

Ayarları yeniden dene

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 Callable nesnesini doğrudan çağırın. Örneğin, GoogleAdsService.searchStream() numarası arandığında yeniden deneme ayarlarını aşağıdaki gibi yapılandırın:

try (GoogleAdsServiceClient googleAdsServiceClient =
    googleAdsClient.getLatestVersion().createGoogleAdsServiceClient()) {
  SearchGoogleAdsStreamRequest request =
      SearchGoogleAdsStreamRequest.newBuilder()
          .setCustomerId(Long.toString(customerId))
          .setQuery("SELECT campaign.id, campaign.name FROM campaign")
          .build();

  // 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());

  // Issues the streaming search request.
  ServerStream<SearchGoogleAdsStreamResponse> stream =
      googleAdsServiceClient.searchStreamCallable().call(request, context);
  for (SearchGoogleAdsStreamResponse response : stream) {
    // Processes the response rows.
  }
}

Başlatma süresi performans optimizasyonu

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

İlk istek performansı uygulamanızın kritik yolundaysa şu adımları uygulayın:

  1. Kullanıcı isteklerine hizmet vermeden önce, başlangıçta GoogleAdsClient oluşturun.

  2. İşlem ilk başladığında Google Ads API'ye birkaç hazırlık 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 (ApiException 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 istemcisini yeniden kullanma

GoogleAdsClient.getLatestVersion().createYYYServiceClient() (veya getVersion25() gibi sürüme özel bir erişimci) her çağrıldığında yeni bir temel bağlantı ve ilişkili kaynaklar oluşturulduğundan, hizmet istemcisi örneklerini mümkün olduğunca yeniden kullanmanız gerekir.

Artık gerekli olmadığında hizmet istemcisini kapattığınızdan emin olun. Bunu try-with-resources bloğunda veya hizmet istemcisinde close()'ı çağırarak yapabilirsiniz.

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

JAR > 32 MB ise 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, özellikle gölge veya shadow JAR dağıtımları kullanılırken bundan çok daha büyüktür. JAR'ları 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-46.1.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ım yapın. Her eklenti, her JAR'ı 10 MB'lık parçalara bölen ve bunları yükleyen bir enableJarSplitting seçenek sunar.

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

Projenizde kitaplığın bağımlılıklarıyla çakışan bağımlılıklar varsa aşağıdaki komutlardan birini kullanarak projenizin bağımlılık hiyerarşisini inceleyin ve ardından projenizin bağımlılıklarını gerektiği gibi değiştirin (veya BoM'u kullanın):

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>46.1.0</version>
</dependency>

Gradle

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