İ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ğu, standart kolaylık yöntemleri yerine temel Callable'e dayanır. Çağrılabilir, burada belgelenmeyen diğer RPC başına özellikler için genellikle iyi bir yerdir.

Zaman aşımı

Java kitaplığı, her çağrı düzeyinde zaman aşımı ayarlamak için bir yüzey sağlar. Varsayılan değer, googleads_grpc_service_config.json'deki 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 Callable nesnesini doğrudan çağırın. Örneğin, GoogleAdsService.searchStream() yöntemini çağırırken zaman aşımını şu şekilde 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 uzun bir süreye ayarlayabilirsiniz ancak API, son derece uzun süren isteklerde zaman aşımına uğrayabilir ve DEADLINE_EXCEEDED hatası döndürebilir. Bu durum sorun teşkil ederse 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 kurtarmanın tek yolunun isteği baştan tekrar tetiklemek olduğu durumdan kaçınılır.

Yeniden deneme ayarları

Java kitaplığı, yeniden deneme ayarlarını çağrı düzeyinde yapılandırmak için bir arayüz de sağlar. Bu özelliği kullanmak için Callable nesnesini doğrudan çağırın. Örneğin, GoogleAdsService.searchStream() çağrılırken 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

Bir GoogleAdsClient örneği ilk kez oluşturulduğunda kısa bir gecikme yaşanabilir. Bunun nedeni, hizmet istemcileri oluşturmak için kullanışlı bir mekanizma sağlamak amacıyla API hizmet sınıflarını tek seferde yükleyen hizmetler için akıcı arayüzdür (GoogleAdsClient.getLatestVersion()).

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

  1. Kullanıcı isteklerini sunmadan önce başlangıçta 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 (ApiException 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.getLatestVersion().createYYYServiceClient() (veya getVersion26() gibi sürüme özel bir erişimci) için yapılan her çağrı, yeni bir temel bağlantı ve ilişkili kaynaklar oluşturduğ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() yöntemini çağırarak yapabilirsiniz.

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

JAR > 32 MB ise App Engine dağıtılamaz

App Engine'de yüklenen her dosya için 32 MB kota vardır. google-ads için JAR, özellikle gölge veya gölge 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-48.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ın. Her eklenti, her JAR'ı 10 MB'lık parçalara bölüp bunları yükleyen bir enableJarSplitting seçeneği 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'yi kullanın):

Maven

mvn dependency:tree

Gradle

./gradlew dependencies

Bağımlılık çakışmalarını çözmek mümkün değilse kitaplığın gölgeli sürümüne bağımlı olabilirsiniz:

Maven

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

Gradle

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