Zaawansowane użycie

Ten przewodnik pokazuje, jak dostosować kilka bardziej zaawansowanych aspektów biblioteki klienta w języku Java. Częstym wzorcem jest to, że wiele z tych funkcji bazuje na Callable, a nie na metodach standardowych. Elementy wywoływane to zwykle dobre miejsce, by poszukać innych funkcji dla RPC, które nie zostały tutaj opisane.

Czas oczekiwania

Biblioteka Java udostępnia platformę do ustawiania limitów czasu na poziomie poszczególnych wywołań. Wartość domyślna jest ustawiana na podstawie ustawienia method_config/timeout w pliku googleads_grpc_service_config.json. Ustaw niższą wartość, jeśli chcesz wymusić krótszy limit maksymalnego czasu wywołania interfejsu API.

Aby korzystać z tej funkcji, należy bezpośrednio użyć obiektu możliwego do wywołania. Jeśli na przykład wywołasz GoogleAdsService.searchStream(), limit czasu zostanie ustawiony tak:

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)));
}

Możesz ustawić limit czasu na co najmniej 2 godziny, ale interfejs API może nadal przekraczać limit czasu trwających żądań i zwracać błąd DEADLINE_EXCEEDED. W takiej sytuacji najlepiej jest podzielić zapytanie i wykonać jego fragmenty równolegle. Pozwala to uniknąć sytuacji, w której długotrwałe żądanie kończy się niepowodzeniem, a jedynym sposobem na odzyskanie żądania jest jego ponowne uruchomienie od początku.

Ustawienia ponawiania

Biblioteka Java udostępnia też platformę do konfigurowania ustawień ponownych prób na poziomie wywołania. Aby korzystać z tej funkcji, należy bezpośrednio użyć obiektu możliwego do wywołania. Jeśli na przykład wywołujesz funkcję GoogleAdsService.searchStream(), ustawienia ponawiania powinny wyglądać tak:

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

Optymalizacja wydajności czasu uruchamiania

Podczas pierwszego tworzenia instancji GoogleAdsClient możesz zauważyć niewielkie opóźnienie. Wynika to z płynnego interfejsu usług (GoogleAdsClient.getVersionXX()), który wczytuje wszystkie klasy interfejsu API naraz, aby stworzyć wygodniejszy mechanizm tworzenia klas usług.

Jeśli wydajność pierwszego żądania znajduje się na ścieżce krytycznej aplikacji, wykonaj te czynności:

  1. Utwórz GoogleAdsClient podczas uruchamiania, zanim obsłużysz żądania użytkowników.

  2. Wyślij kilka żądań rozruchu do interfejsu Google Ads API po rozpoczęciu procesu. Na przykład:

    // 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.
        }
      }
    }
    

Żądania wczytania danych z wyprzedzeniem należy uruchomić tylko raz w danym procesie. Przy każdym kolejnym tworzeniu klienta usługi automatycznie używane będą wstępnie wczytywane klasy.

Ponowne wykorzystanie klienta usługi

W miarę możliwości używaj instancji klienta usługi ponownie, ponieważ każde wywołanie GoogleAdsClient.getVersionXXX().createYYYServiceClient() spowoduje utworzenie nowego połączenia TCP.

Musisz zamknąć klienta, gdy nie jest już wymagany. Możesz to zrobić w bloku try-with-resources lub wywołując close() w kliencie usługi.

Jeśli spróbujesz użyć zamkniętego klienta usługi do wysyłania żądań do interfejsu API, metoda klienta usługi zwróci błąd java.util.concurrent.RejectedExecutionException.

Nie można wdrożyć App Engine, jeśli rozmiar JAR przekracza 32 MB

W App Engine obowiązuje limit 32 MB na każdy przesyłany plik. Biblioteka JAR dla zasobu google-ads będzie znacznie większa, jeszcze bardziej jeśli użyjesz wdrożeń odcienia/cienia. Jeśli wdrożysz pliki jar ręcznie, możesz napotkać takie błędy:

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])

Zamiast tego wdróż ją za pomocą wtyczki Gradle lub Maven w App Engine. Każdy z nich ma opcję enableJarSplitting, która dzieli każdy plik JAR na fragmenty o rozmiarze 10 MB i przesyła te pliki.

Zależności cienia

Jeśli w Twoim projekcie występują zależności kolidujące z zależnościami biblioteki, sprawdź zależności projektu za pomocą jednego z poniższych poleceń, a następnie odpowiednio zmień zależności w projekcie.

Maven

mvn dependency:tree

Gradle

./gradlew dependencies

Jeśli nie możesz rozwiązać konfliktów zależności, możesz polegać na shaded wersji biblioteki.

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'